Могу ли я использовать шаблон наблюдателя для обработки ошибок? - PullRequest
3 голосов
/ 06 марта 2012

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

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();**
.....
}
}

Ответы [ 3 ]

6 голосов
/ 06 марта 2012

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

public interface ErrorHandler {

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

}

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

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

2 голосов
/ 06 марта 2012

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

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

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

2 голосов
/ 06 марта 2012

Шаблон 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...