如何在没有抛出异常的情况下运行代码?
最后代码运行是否存在异常。
try {
//do something
} catch (Exception e) {}
//do something only if nothing was thrown
答案 0 :(得分:42)
以下是两种方式:
try {
somethingThatMayThrowAnException();
somethingElseAfterwards();
} catch (...) {
...
}
或者,如果您希望第二个代码块超出try
块:
boolean success = false;
try {
somethingThatMayThrowAnException();
success = true;
} catch (...) {
...
}
if (success) {
somethingElseAfterwards();
}
你也可以将if
语句放在finally
块中,但是你的问题中没有足够的信息来判断这是否更合适。
答案 1 :(得分:17)
try {
doSomething();
doSomething2();
} catch (Exception e) {
doSomething3();
}
在此示例中,doSomething2()
仅在doSomething()
未引发任何异常时才会执行。
如果doSomething()
引发异常,则会跳过doSomething2();
,执行将跳转到doSomething3();
另请注意,如果doSomething3()
doSomething2();
如果没有抛出异常,则不会执行doSomething3();
。
答案 2 :(得分:3)
只需将代码放入try
块即可。如果抛出异常,它将跳转到catch
块。如果没有抛出异常,代码就会运行。
try {
someMethodThatMayThrowException();
codeThatShouldBeRunIfNoExceptionThrown();
} catch (Exception e) {...}
答案 3 :(得分:1)
流量控制的异常是一种不好的做法。如果您坚持,请使用boolean
变量。
boolean thrown = false;
try {
//do something
} catch (Exception e) {
thrown = true;
}
//do something only if nothing was thrown
if (!thrown) {
// do stuff
}
答案 4 :(得分:1)
对拟议
的增强try {
somethingThatMayThrowAnException();
somethingElseAfterwards();
} catch (...) {
...
}
从接受的答案。你应该做的是:
void foo() {
try {
doStuff();
} catch (...) {
handleException();
}
}
对于没有接触过“干净代码思维”的人来说,上述感觉有些过分。
但重点在于:你不希望在一种方法中混合使用不同的抽象。换句话说:你没有一个try块,并且在同一个方法中有更多代码。
您确保每个方法和任何方法都包含直接路径 - 您可以避免任何使您的阅读流程复杂化的问题。一旦习惯了编写和阅读这类类代码,您就会发现理解代码的时间大大减少。
答案 5 :(得分:0)
当我遇到这个问题时,我正在尝试解决这个确切的问题,这里的答案帮助我进行了思考,并意识到,至少在我的特定情况下,这是我应该提出的错误问题。
我想创建此方法,因为我已经在main()中进行了此操作,并且希望在其他地方进行此操作以实现可移植性。所以我复制了一个包含try / catch块的代码块。但是,事实证明,我根本不想复制catch块,因为如果Connection的创建失败,我只是想完全失败。
现在看来很明显,但是我从来没有想过要首先捕获异常。该代码仅存在于此,因为我复制并粘贴了它。因此,如果由于在try块中而可能不生成值而发现自己在问这个问题,那么请考虑是否只想完全失败而不返回任何不必要的代码。