如何使代码只在没有抛出异常的情况下运行?使用finally,无论是否有异常,代码都会运行。
try { //do something } catch (Exception e) {} //do something only if nothing was thrown
ecfsfe2w1#
这里有两种方法:
try { somethingThatMayThrowAnException(); somethingElseAfterwards(); } catch (...) { ... }
或者,如果你想让第二个代码块在try块之外:
try
boolean success = false; try { somethingThatMayThrowAnException(); success = true; } catch (...) { ... } if (success) { somethingElseAfterwards(); }
您也可以将if语句放在finally块中,但是您的问题中没有足够的信息来判断这是否更可取。
if
finally
gzjq41n42#
try { doSomething(); doSomething2(); } catch (Exception e) { doSomething3(); }
在这个例子中,doSomething2()只有在doSomething()没有抛出异常时才会被执行。如果doSomething()抛出异常,则doSomething2();将被跳过,执行将跳转到doSomething3();还要注意,如果doSomething2();抛出异常,则将执行doSomething3()如果没有抛出异常,则不会执行doSomething3();。
doSomething2()
doSomething()
doSomething2();
doSomething3();
doSomething3()
l3zydbqr3#
把代码放在try块中。如果抛出异常,它将跳到catch块。如果没有抛出异常,代码将直接运行。
catch
try { someMethodThatMayThrowException(); codeThatShouldBeRunIfNoExceptionThrown(); } catch (Exception e) {...}
exdqitrt4#
对建议的
从公认的答案。你应该做的是:
void foo() { try { doStuff(); } catch (...) { handleException(); } }
对于那些没有接触过“干净代码思维”的人来说,上面的内容似乎有些矫枉过正。但重点是你不想在一个方法中混合不同的抽象。换句话说:你没有一个try块,在同一个方法中,后面有更多的代码。您要确保每个方法都包含一个直接的路径-您要避免任何使您的阅读流程复杂化的内容。一旦你习惯了编写和阅读这种类型的代码,你就会发现理解代码所花费的时间大大减少。
ljsrvy3e5#
流控制的异常是一种不好的做法。如果你坚持的话,使用一个boolean变量。
boolean
boolean thrown = false; try { //do something } catch (Exception e) { thrown = true; } //do something only if nothing was thrown if (!thrown) { // do stuff }
0wi1tuuw6#
当我遇到这个问题时,我正试图解决这个问题,这里的答案帮助我思考并意识到,至少在我的特殊情况下,这是我应该问的错误问题。我想创建这个方法,因为我已经在main()中做了,为了可移植性,我想在其他地方做。所以我复制了一个包含try/catch块的代码块。然而,事实证明,我根本不想复制catch块,因为如果Connection的创建失败,我只想完全失败。现在看起来很明显,但我从来没有想在第一时间实际捕获异常。代码之所以存在是因为我复制并粘贴了它。因此,如果你发现自己问这个问题是因为你在一个try块中,你可能不会生成一个值,那么考虑一下,如果你只是想完全失败,不返回任何东西,那么这个额外的代码是不必要的。
doinxwow7#
在我看来,最干净的方法来解决这个问题,如果你不需要任何额外的功能,如果一个异常被引发,是返回。
try { doSomthing(); } catch (Exception e) { handleException(); return; } onlyIfSuccess();
7条答案
按热度按时间ecfsfe2w1#
这里有两种方法:
或者,如果你想让第二个代码块在
try
块之外:您也可以将
if
语句放在finally
块中,但是您的问题中没有足够的信息来判断这是否更可取。gzjq41n42#
在这个例子中,
doSomething2()
只有在doSomething()
没有抛出异常时才会被执行。如果
doSomething()
抛出异常,则doSomething2();
将被跳过,执行将跳转到doSomething3();
还要注意,如果
doSomething2();
抛出异常,则将执行doSomething3()
如果没有抛出异常,则不会执行
doSomething3();
。l3zydbqr3#
把代码放在
try
块中。如果抛出异常,它将跳到catch
块。如果没有抛出异常,代码将直接运行。exdqitrt4#
对建议的
从公认的答案。你应该做的是:
对于那些没有接触过“干净代码思维”的人来说,上面的内容似乎有些矫枉过正。
但重点是你不想在一个方法中混合不同的抽象。换句话说:你没有一个try块,在同一个方法中,后面有更多的代码。
您要确保每个方法都包含一个直接的路径-您要避免任何使您的阅读流程复杂化的内容。一旦你习惯了编写和阅读这种类型的代码,你就会发现理解代码所花费的时间大大减少。
ljsrvy3e5#
流控制的异常是一种不好的做法。如果你坚持的话,使用一个
boolean
变量。0wi1tuuw6#
当我遇到这个问题时,我正试图解决这个问题,这里的答案帮助我思考并意识到,至少在我的特殊情况下,这是我应该问的错误问题。
我想创建这个方法,因为我已经在main()中做了,为了可移植性,我想在其他地方做。所以我复制了一个包含try/catch块的代码块。然而,事实证明,我根本不想复制catch块,因为如果Connection的创建失败,我只想完全失败。
现在看起来很明显,但我从来没有想在第一时间实际捕获异常。代码之所以存在是因为我复制并粘贴了它。因此,如果你发现自己问这个问题是因为你在一个try块中,你可能不会生成一个值,那么考虑一下,如果你只是想完全失败,不返回任何东西,那么这个额外的代码是不必要的。
doinxwow7#
在我看来,最干净的方法来解决这个问题,如果你不需要任何额外的功能,如果一个异常被引发,是返回。