少尝试/更多捕获

时间:2013-10-17 14:27:21

标签: 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();
}

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();
}

6 个答案:

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

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

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)

这是非常不同的!

在您的第一个代码中:

  • 如果ix触发ex1,它将继续iy。但如果它触发了ex3, 一切都会停止。
  • 如果iy触发ex2,它将继续iz。但如果触发ex3,一切都会停止。

在你的第二段代码中:

  • 如果抛出异常,一切都会停止。

您应该阅读this tutorial

答案 5 :(得分:2)

您的问题没有单一,正确的答案。 取决于。从其他答案中可以看出,您的第一个和第二个代码的执行方式不同(第二个示例中可能会跳过某些操作)。 你应该关注:

  • 您正在捕获的异常类型(这些异常是不同的,您希望以不同方式处理它们吗?),
  • 你将如何处理异常,
  • 是影响代码其他部分的一个例外,
  • 是两个或更多个例子,将由单个catch语句捕获,

您应该针对特定情况考虑每种解决方案。