【问题标题】:Java run code only if no exception is thrown in try and catch block?仅当 try 和 catch 块中没有引发异常时,Java 才运行代码?
【发布时间】:2015-07-13 05:00:18
【问题描述】:

如何使代码仅在没有抛出异常的情况下运行?

无论有没有异常,最终代码都会运行。

try {
   //do something
} catch (Exception e) {}
//do something only if nothing was thrown

【问题讨论】:

  • 为什么不把它放在异常抛出调用下方的try 块中?

标签: java exception-handling try-catch


【解决方案1】:

这里有两种方法:

try {
    somethingThatMayThrowAnException();
    somethingElseAfterwards();
} catch (...) {
    ...
}

或者,如果您希望您的第二个代码块位于 try 块之外:

boolean success = false;
try {
    somethingThatMayThrowAnException();
    success = true;
} catch (...) {
    ...
}
if (success) {
    somethingElseAfterwards();
}

您也可以将if 语句放在finally 块中,但您的问题中没有足够的信息来判断这是否更可取。

【讨论】:

  • 第一种方式确实是很自然的方式。引入局部变量和间接读取的第二个在这里没有任何优势。
  • @davidxxx“没有优势”——这取决于用例。在某些情况下,您可能希望第二个任务在 try 块外部而不是内部执行。您可能不希望以与第一个块中的异常相同的方式处理第二个块中的执行。
【解决方案2】:
try {
    doSomething();
    doSomething2();
} catch (Exception e) {
    doSomething3();
}

在这个例子中,doSomething2() 只会在doSomething() 没有抛出异常的情况下才会被执行。

如果doSomething()抛出异常,doSomething2();会被跳过,执行会跳转到doSomething3();

另外注意,如果doSomething2();抛出异常,doSomething3()会被执行

如果没有抛出异常,doSomething3();将不会被执行。

【讨论】:

  • 但是如果doSomething2 抛出异常怎么办?我不希望它被抓住。
  • 所以您希望doSomething2() 保持该顺序,但如果它抛出异常,它不会被捕获并执行doSomething3()?您可以将doSomething2() 放在它自己的try catch 块中(嵌套的try 块),而您的catch 不能像catch (Exception e) {} 那样做任何事情。
  • 我想在doSomething()初始化一些最终值,如果抛出异常,我希望最终值保留一些备用值。那该怎么做呢?
  • 如果你想改变这个值,它不是最终的。
  • try { doSomething1(); doSomething2(); doSomething3(); } catch (Exception e) { doSomething4(); } @ThePerson 我想做一些像doSomething1,2,3 这样的事情
【解决方案3】:

只需将代码放在try 块中即可。如果抛出异常,它将跳到catch 块。如果没有抛出异常,代码就会运行。

try {
    someMethodThatMayThrowException();
    codeThatShouldBeRunIfNoExceptionThrown();
} catch (Exception e) {...}

【讨论】:

  • 问题变成了:如果SomeException 非常笼统——如果它可以被codeThatShouldBeRunIfNoExceptionThrown 抛出,或者如果该方法更改为将来抛出该异常——那么你的捕获块将(静默)不再只处理原始异常。
  • @pathfinderelite 你的回答很好(+1)。我通过关注原始需求进行了更新。
【解决方案4】:

对提议的增强

try {
    somethingThatMayThrowAnException();
    somethingElseAfterwards();
} catch (...) {
    ...
}

来自接受的答案。你应该做的是:

void foo() {
  try {
    doStuff();
  } catch (...) {
    handleException();
  }
}

对于那些没有接触过“干净代码思维”的人来说,上面的内容感觉有点矫枉过正。

但这里的重点是:您确实希望在一种方法中混合不同的抽象。换句话说:您没有一个 try 块,并且在同一方法中后面有更多代码。

您确保每个方法都包含一条直截了当的路径 - 您避免任何使您的阅读流程复杂化的事情。一旦您习惯了编写和阅读 此类 类型的代码,您就会发现理解代码所需的时间大大减少。

【讨论】:

  • 接受答案的最佳部分(第一部分而不是第二部分:))有奖金! :)
  • @davidxxx 谢谢。总是很高兴收到您的来信;-)
【解决方案5】:

流控制的异常是一种不好的做法。如果您坚持,请使用 boolean 变量。

boolean thrown = false;

try {
   //do something
} catch (Exception e) {
   thrown = true;
}

//do something only if nothing was thrown

if (!thrown) { 
    // do stuff
}

【讨论】:

    【解决方案6】:

    当我遇到这个问题时,我试图解决这个确切的问题,这里的答案帮助我思考并意识到,至少在我的特定情况下,这是我应该问的错误问题。

    我想创建这个方法,因为我已经在 main() 中做了它,并且想在其他地方做它以实现可移植性。所以我复制了一个包含 try/catch 块的代码块。然而,事实证明,我根本不想复制 catch 块,因为如果 Connection 的创建失败,我只想完全失败。

    现在看起来很明显,但我从一开始就不想真正捕获异常。那个代码只是在那里,因为我复制并粘贴了它。因此,如果您发现自己问这个问题是因为您在 try 块中并且您可能不会生成值,那么请考虑您是否只是想完全失败并且不返回任何东西,这样额外的代码是不必要的。

    【讨论】:

      猜你喜欢
      • 2019-11-11
      • 2018-03-04
      • 2017-04-15
      • 2021-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-12
      相关资源
      最近更新 更多