Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Архитекура обработки исключений


Автор: vdweller 21.4.2008, 10:23
Вопрос следующий - как архитектурно более правильно обрабатывать исключения?
Все серьезные исключения я хочу обрабатывать в одном месте, как более правильно сделать - вызывать сразу же в случае пойманного исключения определенный обработчик, либо пробрасывать исключения через цепочку throws до основного класса где уже стоит catch который все обрабатывает?

Автор: AntonSaburov 21.4.2008, 12:46
Это не имеет однозначного решения - я исхожу из принципа "чем ниже можно обработать, тем лучше". Но иногда это можно сделать чуть ли не в самом низу, а иногда только самый верхний выхов может реально решить, что с этим делать.

Автор: olegrolik 21.4.2008, 17:39
А я делаю вот так (возможно это криво, но я считаю, что вариант неплохой).
Есть, например класс MainEngine:
Код

try {   
  method1();
  method2();
  method3();
} catch(Method1Exception e) {
   String errNumber = e.getErrorNumber();
   String errorDecription = e.getErrorDescription();
// здесь можно использовать errNumber и errorDecription для чего-нибудь, например для отправки письма с этими объектами.
} catch(Method2Exception e) {
   // тоже самое, что и в 1ом эксепшене
} catch(Method3Exception e) {
   // тоже самое, что и в 1ом эксепшене
} 


реализация методов method1, method2, method3.
Код

public void method1() throws Method1Exception {
   if(/* что-то произошло нехорошее) throw new Method1Exception("error number 1","decription of error");
}
// Здесь тоже самое для method2 и method3



Класс-исключение.
Код

public class Method1Exception extends Exception {
    private String errorNumber;
    private String description;
    
    public ValidationException (String errorNumber, String description) {
        super(errorNumber+": "+description);
        this.errorNumber = errorNumber;
        this.description = description;        
    }
    public String getErrorNumber() {
        return errorNumber;
    }
    public String getErrorDescription() {
        return description;
    }    
}

Для 2 и 3 случая тож самое (ну или уже зависит от вас).

Может украл у кого эту идею, но на программный код авторское право не распространяется...  smile 

Автор: Asal 22.4.2008, 10:33
Цитата(AntonSaburov @  21.4.2008,  12:46 Найти цитируемый пост)
"чем ниже можно обработать, тем лучше"

на мой взгяд еще нужно смотреть что за ошибка.
если ошибка не несет логического смысла для "вышележащих" функций то и не стоит ее передавать вверх по цепочке, обработал и все.
или если ошибка внутренней работы функции (зачем лишний раз беспокоить вышестоящее рукаводство  smile  + наплодится блоков try)
Вообщем нужно исходить из логического смысла ошибки  smile 
Но это мое мнение, коль не прав поправьте  smile 

P.S. если интересно, есть классный http://www.infoq.com/presentations/effective-api-design Joshua Bloch из Google

Автор: AntonSaburov 22.4.2008, 12:43
Цитата(Asal @  22.4.2008,  10:33 Найти цитируемый пост)
если ошибка не несет логического смысла для "вышележащих" функций то и не стоит ее передавать вверх по цепочке, обработал и все.
или если ошибка внутренней работы функции (зачем лишний раз беспокоить вышестоящее рукаводство  smile  + наплодится блоков try)

Именно это  я и имею в виду.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)