Java 运行 只有在 try 和 catch 块中没有抛出异常时才编写代码?

Java run code only if no exception is thrown in try and catch block?

如何使代码仅在没有抛出异常时运行?

无论是否有异常,finally 代码都会运行。

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

在这个例子中,doSomething2()只有在doSomething()没有抛出异常时才会执行。

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

执行

另请注意,如果doSomething2();

抛出异常,则会执行doSomething3()

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

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

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

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

boolean thrown = false;

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

//do something only if nothing was thrown

if (!thrown) { 
    // do stuff
}

这里有两种方法:

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

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

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

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

提议的改进

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

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

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

对于没有接触过 "clean code thinking" 的人来说,以上内容感觉有点矫枉过正。

但这里的要点是:您不是想要在一个方法中混合不同的抽象。换句话说:您没有一个 try 块,也没有在同一个方法中紧随其后的更多代码。

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

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

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

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