use*_*284 2 java performance exception-handling try-catch
我需要知道是否做得更少尝试和做更多Catchs是一种控制通量的好方法,这在异常控制方面非常重要.
因为在焊剂中,如果出现问题,这种情况永远不会发生!
我不是想保存代码行,我需要一些在视觉上易于理解和功能的东西
Var ix;
Var iy;
Var iz;
try {
try {
do something ix;
} catch (Exception ex1) {
ex1.printStackTrace();
}
try {
do something iy;
} catch (Exception ex2) {
ex2.printStackTrace();
}
do something iz;
} catch (Exception ex3) {
ex3.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
要么
Var ix;
Var iy;
Var iz;
try {
do something ix;
do something iy;
do something iz;
} catch (Exception ex1) {
ex1.printStackTrace();
} catch (Exception ex2) {
ex2.printStackTrace();
} catch (Exception ex3) {
ex3.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
始终在尽可能小的范围内捕捉异常; 使用过于广泛的捕获量
} catch (Exception ex) {
// wrong. use explicit exceptions,
// e.g. catch(NullPointerException ex) instead, possibly with multicatch
Run Code Online (Sandbox Code Playgroud)
或者抓住太大的范围
try {
//... tons of code
} catch (IOException ex) {
// and the exception happened WHERE?
}
Run Code Online (Sandbox Code Playgroud)
本身就是一种反模式.
这件事说,其他人说的都是正确的.代码的行为会有所不同,因为嵌套的catch 实际上会处理在其中遇到的异常而不会将其传播到外部.
以这种方式完成多次捕获,例如Exception(替换为例如NullPointerException,并且这个想法仍在那里)
try {
try {
// some code
} catch (Exception ex1) { /* stack dump or whatever */ }
} catch (Exception ex2) { /* stack dump or whatever */ }
Run Code Online (Sandbox Code Playgroud)
也不会有效,因为内部异常是给定类型的每个异常的有效捕获(在这种情况下 - 完全是每个异常) - 因此没有任何可捕获的东西会传播到外部的try/catch块.
另一件事(已经无数次说过)是你应该治愈异常,抛弃它(传播)或者死于异常.简单地进行堆栈转储就像是说"你,亲爱的先生,患有癌症".它并没有改善任何人的处境.如果你无法帮助它,请传播它.如果没有什么可以处理它,那么就会有一些优雅(堆栈转储对于一个线程来说不是一种优雅的方式......).
还有一个需要区分的是Java的Throwable类型,即错误与已检查/未检查的异常差异.一般来说:
tl; dr - 请在实际使用之前了解使用异常的基本原理.
进一步阅读:http://docs.oracle.com/javase/tutorial/essential/exceptions/和http://www.amazon.com/Effective-Java-Edition-Joshua-Bloch/dp/0321356683(第39项:使用例外情况仅适用于例外情况,第40项:对可恢复条件使用已检查异常,对编程错误使用运行时异常,第41项:避免不必要地使用已检查异常,第43项:抛出适用于抽象的异常.)