【发布时间】:2012-02-19 16:22:50
【问题描述】:
我是一个顽皮的程序员,直到现在我还没有正确处理错误(例如,只是捕获 java.lang.Exception,打印调试消息,然后继续)。当我“处理”它们时,只是关闭了编译器。
我最近发现了我的方法的错误(哈哈),并想开始做正确的事。所以我在这里和其他地方(通过谷歌搜索)研究它。
假设我有一段代码执行以下操作:
...
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();从外面。这是一个“好”的做法吗?我是否陷入了某种反模式?
谢谢!
【问题讨论】:
标签: java error-handling