2012-03-06 3 views
3

Могу ли я использовать шаблон наблюдателя для обработки ошибок? Каковы его преимущества и недостатки? Использует ли кто-нибудь этот подход для этой цели?Могу ли я использовать шаблон наблюдателя для обработки ошибок?

UPDATE:

class MyErrorApi{ 
public static final int NETWORK_ERROR = 1; 

public(MyErrorApi error){ 
... 
} 
} 


interface ErrorListener{ 
void onErrorOcurred(MyErrorApi arror) 
} 


class MyBaseScreen implements ErrorListener{ 


void onErrorOcurred(MyErrorApi arror){ 
swirch(arror){ 
**showPopup();** 
..... 
} 
} 
+2

Можете ли вы привести пример того, что вы имели в виду? Обработка ошибок - довольно широкий вопрос. – biziclop

+0

как вы обрабатываете ошибки? вы их исправляете, регистрируете, откатываете в предыдущее состояние и т. д. ... – UmNyobe

+1

Лучшее для начала; в чем проблема, которую я пытаюсь решить, а затем найти лучшее решение. Вам не следует начинать с решения, которое вы хотели бы использовать, а затем посмотреть, подходит ли оно этой проблеме. –

ответ

6

Скорее вам нужен простой обратный вызов, как ErrorHandler:

public interface ErrorHandler { 

    /** 
    * Handle the given error, possibly rethrowing it as a fatal exception 
    */ 
    void handleError(Throwable t); 

} 

Это довольно распространенный подход - зарегистрировать метод обратного вызова, чтобы получать уведомления, когда происходит исключение где-то. Однако это не строго Observer - состояние целевого объекта не изменилось, вы только уведомлены об ошибке, которая произошла в целевой (что, с другой стороны, является видом события).

Также обычно у вас может быть более одного Observer. Редко приходится иметь более одного обработчика ошибок, но не трудно себе представить.

+0

В более сложной и интерактивной управляемой системе у вас может быть одна, которая записывает журналы и отправляет уведомления и т. Д. Это может быть слишком педантичным. – biziclop

+0

Этот подход может быть обобщен на интерфейс EventHandler, в то время как событие передается как аргумент метода handleEvent. Тогда информация об ошибке может быть передана в самом событии ... – aviad

2

Образец Observer может использоваться для ошибок отчет. Что-то обнаруживает условие ошибки и испускает ErrorEvent, что-то еще сообщает об ошибке журналу или системе управления. Это довольно часто.

Однако рассмотрим основной поток кода: вам, вероятно, нужно принимать различные пути

fetch customer's details 
if customer is a good credit risk 
    lend them some money 

, что делает ваш код делать, если подробности заказчика не может быть извлечена из-за ошибки? По концепции вам необходимо

fetch customer's details 
if the fetch worked AND customer is a good credit risk 
    lend them some money 

Существует определенный уровень прямых условий при отсутствии ошибки. Мы можем реализовать это с помощью обработки исключений или проверки ошибок, но, тем не менее, мы это делаем, мы должны по-настоящему ОБРАТИТЬ ошибку в нашей логике.

Теперь можно создать более управляемую событиями систему, в которой все происходит, реагируя на события. В этом случае все, а не только обработка ошибок, выполняется с использованием шаблона Observer.

2

Паттерн Наблюдатель выглядит многообещающим, если у вас есть одна из следующих конструкций (или оба):

  • Мы один источник, который обнаруживает ошибки и производит уведомления об ошибках. Затем нужно разрешить другим (неизвестным) компонентам получать эти уведомления.
  • У нас есть один центральный компонент, который может обрабатывать уведомления об ошибках и хочет, чтобы он прослушивал другие (неизвестные) компоненты, которые производят сообщения об ошибках.

В других случаях мы можем найти проекты, которые подходят лучше.

Смежные вопросы