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 任何东西,这样就不需要额外的代码了。
如何使代码仅在没有抛出异常时运行?
无论是否有异常,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 任何东西,这样就不需要额外的代码了。