Обработка ошибок - это достойный шаблон?

Я непослушный программист, и до сих пор я не обрабатывал ошибки должным образом (например, просто перехватил 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 (); снаружи. Это «хорошая» практика? Я попадаю в антипаттерны?

Спасибо!

12
задан loneboat 26 January 2012 в 15:23
поделиться