Я нехороший программист, и до сих пор я неправильно обрабатывал ошибки (например, просто ловил java.lang.Exception, печатал сообщение отладки и двигался дальше). Когда я «обрабатываю» их, просто закрывать компилятор.Обработка ошибок - это приличный шаблон?
Я недавно узнал об ошибке (ха-ха) моих способностей и хотел бы начать делать это правильно. Поэтому я исследую его здесь и в других местах (через поисковые запросы Google).
Предположим, у меня есть блок кода, который делает следующее:
...
x.method1(); // throws ExceptionTypeA
...
y.method2(); // throws ExceptionTypeB
...
z.method3(); // throws ExceptionTypeC
...
x.method4(); // throws ExceptionTypeA (again)
...
Из того, что я собрал, правильный способ справиться с этим:
try {
...
x.method1(); // throws ExceptionTypeA
...
y.method2(); // throws ExceptionTypeB
...
z.method3(); // throws ExceptionTypeC
...
x.method4(); // throws ExceptionTypeA (again)
...
} catch (ExceptionTypeA e) {
// do something about condition A
} catch (ExceptionTypeB e) {
// do something about condition B
} catch (ExceptionTypeC e) {
// do something about condition C
}
Это кажется довольно просто я, но, похоже, становится беспорядочным, когда у меня длинный блок кода, который вызывает различные ошибки. Кажется, я завершаю только одну гигантскую попытку/поймать весь мой метод! Альтернативой представляется следующее:
try {
...
x.method1(); // throws ExceptionTypeA
...
} catch (ExceptionTypeA e) {
// do something about condition A
}
try {
...
y.method2(); // throws ExceptionTypeB
...
} catch (ExceptionTypeB e) {
// do something about condition A
}
try {
...
z.method3(); // throws ExceptionTypeC
...
} catch (ExceptionTypeC e) {
// do something about condition C
}
try {
...
x.method4(); // throws ExceptionTypeA
...
} catch (ExceptionTypeA e) {
// do something about condition A
}
Это выглядит действительно противно. В таких случаях, я рассматривал делать что-то вроде следующего:
private void doSomething() throws exceptionTypeA, exceptionTypeB, exceptionTypeC {
...
x.method1(); // throws ExceptionTypeA
...
y.method2(); // throws ExceptionTypeB
...
z.method3(); // throws ExceptionTypeC
...
x.method4(); // throws ExceptionTypeA (again)
...
}
public void doSomething_andHandleErrors() {
try {
this.toSomething();
} catch (ExceptionTypeA e) {
// do something about condition A
} catch (ExceptionTypeB e) {
// do something about condition B
} catch (ExceptionTypeC e) {
// do something about condition C
}
}
... а затем просто призывая doSomething_andHandleErrors(); снаружи. Является ли это «хорошей» практикой? Я попадаю в какой-то анти-шаблон?
Спасибо!
Я бы переместил это на http://codereview.stackexchange.com –