少尝试/更多捕获

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)

tre*_*r-e 10

这两个例子实际上会有不同的表现.在第二个中,如果捕获到异常,则do something不会运行以下任何操作.在第一个,他们每个人都可以独立失败.


vax*_*uis 7

始终在尽可能小的范围内捕捉异常; 使用过于广泛的捕获量

} 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类型,即错误与已检查/未检查的异常差异.一般来说:

  • 错误应该导致线程立即死亡,因为它表示严重的VM /硬件错误,
  • 未经检查的异常(想到RuntimeException)是一个非常特殊的情况,不可能或很难预测,所以通常不应该包含它,而只是通过编程回退到最后有效执行的代码分支向用户发出信号,
  • checked异常是一种常见的异常情况,反过来,它必须由程序员明确处理,不应该破坏程序执行.

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项:抛出适用于抽象的异常.)