Я проницательный программист, и до сих пор я неправильно обрабатывал ошибки (например, просто перехватывал 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(); снаружи. Является ли это "хорошей" практикой? Я попадаю в какой-то анти-шаблон?
Спасибо!