我需要知道是否做得更少尝试并做更多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();
}
OR
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();
}
答案 0 :(得分:10)
这两个例子实际上会有不同的表现。在第二个中,如果捕获到异常,则以下do something
都不会运行。首先,他们每个人都可以独立失败。
答案 1 :(得分:7)
始终在尽可能小的范围内捕捉异常;使用过于广泛的捕获量,如
} catch (Exception ex) {
// wrong. use explicit exceptions,
// e.g. catch(NullPointerException ex) instead, possibly with multicatch
或抓住太大的范围
try {
//... tons of code
} catch (IOException ex) {
// and the exception happened WHERE?
}
本身就是一种反模式。
这件事说,其他人说的都是正确的。代码的行为会有所不同,因为嵌套的catch实际上处理在其中遇到的异常,不将其传播到外面。
例如多次捕获以这种方式完成的异常(替换为例如NullPointerException和想法仍然存在)
try {
try {
// some code
} catch (Exception ex1) { /* stack dump or whatever */ }
} catch (Exception ex2) { /* stack dump or whatever */ }
也无法正常工作,因为内部异常是给定类型的每个异常的有效捕获(在这种情况下 - 所有异常) - 因此 nothing catchable将在其外部传播到外部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项:抛出适合抽象的例外。)
答案 2 :(得分:4)
这两种方式在逻辑上是不同的。在第一种方式中,即使操作“ix”抛出异常,您也会尝试执行“iy”操作。在第二种方式中,如果动作“ix”抛出异常,则“iy”和“iz”将永远不会被执行。
答案 3 :(得分:4)
我会说这取决于你想要什么。您的任何例外是否可以恢复?你想在遇到异常后继续前进吗?这些事情决定了你如何处理异常。或者至少,我是怎么做的。
答案 4 :(得分:4)
这是非常不同的!
在您的第一个代码中:
在你的第二段代码中:
您应该阅读this tutorial。
答案 5 :(得分:2)
您的问题没有单一,正确的答案。 取决于。从其他答案中可以看出,您的第一个和第二个代码的执行方式不同(第二个示例中可能会跳过某些操作)。 你应该关注:
您应该针对特定情况考虑每种解决方案。