Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 何时使用try finally和not try catch finally_Java_Exception_Try Catch - Fatal编程技术网

Java 何时使用try finally和not try catch finally

Java 何时使用try finally和not try catch finally,java,exception,try-catch,Java,Exception,Try Catch,使用Try-Catch-Finally块的最佳实践是什么?您喜欢只使用try finally块而不使用try catch块吗?我一直认为,最后尝试接球是最好的做法。然而,在我使用的部分代码中,我看到了如下代码: 试一试{ doSomething(); } 最后{ doSomethingElse(); } 因为他们没有捕获异常,所以调试代码对我来说非常困难。这对我来说不是一个很好的练习,只是最后才使用catch,但我可能错了 据我所知,这并不是一个好的做法。基本上,我们并没有利用try-catch

使用Try-Catch-Finally块的最佳实践是什么?您喜欢只使用try finally块而不使用try catch块吗?我一直认为,最后尝试接球是最好的做法。然而,在我使用的部分代码中,我看到了如下代码:

试一试{ doSomething(); } 最后{ doSomethingElse(); }

因为他们没有捕获异常,所以调试代码对我来说非常困难。这对我来说不是一个很好的练习,只是最后才使用catch,但我可能错了

据我所知,这并不是一个好的做法。基本上,我们并没有利用try-catch的用途。我也发现了类似的情况


我的问题是:“你同意我的以下假设吗:最好的做法是一起使用try-catch finally而不是try-finally。”如果你不同意,请给我举个例子,说明什么时候使用try-finally而不是try-catch finally,以及为什么你认为try-finally比try-catch更好?

我不同意,如果无法对引发的异常执行任何操作,但调用方层次结构的更高层可以执行,则使用finally清理资源,并让调用方在引发异常后处理清理。

finally构造的目的是提供始终执行的代码,即使抛出了异常

try/finally(无捕获)允许您编写保证执行的代码,即使try块内的代码引发运行时异常


在您使用的代码可能会引发运行时异常,但不会引发已检查异常的情况下,这是很好的。这方面的一个例子是SpringDao支持;它将IOExceptions封装在运行时异常中。

通常使用try finally来确保执行某些代码,而不管是否发生异常。 通常缺少Catch块,因为try块中的代码不会抛出任何可以捕获的已检查异常

例如:


有三种可能,try+catch、try+finally或try+catch+finally。它们都有自己的用途

当您可以有效地处理异常时,可以使用catch with try,例如报告异常发生的事实

finally块中的代码始终运行,与是否发生异常无关,因此在需要清理时使用finally和try,这是必须的。例如,如果文件已成功打开,则关闭该文件。

我不同意

try{}最后{}应在无法处理异常但需要清理资源的情况下使用

try{}finally{}块不会像您认为的那样导致异常“消失”。它将被抛出堆栈,并在其他地方处理。如果您无法在当前应用程序中看到异常,那是因为它被丢弃在其他地方

try {
    connection = createConnection();
}
finally {
    closeConnection(connection) //Free database connection.
}

在这种情况下,您可能无法处理SQL异常,但仍希望释放数据库连接。

在这种情况下,您将有一个捕获,向调用函数抛出新异常,否?这绝对正确。有时,您可能无法处理异常,或者不想处理异常,但您确实希望确保错误不会导致资源处于打开状态,从而影响后续运行的性能。在这种情况下,试一试最终是优秀的,钢琴家何必费心呢?正如我所说的,您无法处理这种情况,所以让异常渗透,直到它能够被处理为止,但这并不能原谅接近异常的代码处理清理资源。在发生这种情况的代码中,我通常会记录我希望抛出的内容以及何时减少混淆。@75inchpianist,否。如果抛出异常,它将被抛出堆栈,直到有人处理它为止。它不会在一次尝试中“消失”{}最终{},因为没有捕获到任何东西it@sheidaei是的,这就是它的工作原理。除非您的finally代码抛出异常,否则如果发生这种情况,那么原始异常将被抑制,并且在我看来finally块永远不应该被允许抛出异常(但它们应该记录它们)。@Perception我在原始问题中提到过这一点。这对我来说不是重复的,因为他没有直接询问何时使用try finally块。我可能错了。这正是另一个问题作者问“使用try/finally而不使用catch反模式”时的意思。在这种情况下,反模式是一种不应该遵循的实践(也称为非最佳实践)。你的问题是基本的重复。因此,捕获异常,做点什么(至少记录它),然后在我无法处理异常时抛出异常,这不是更好的做法吗?你当然可以这样做,但对我来说,这不是最佳做法。首先,这意味着同一个异常可能会被记录多次,在调用堆栈展开时,在每个catch块中记录一次。我认为将异常记录在最高级别并使用StackTrace方法来确定和记录异常发生的位置更有意义。这还有一个好处,就是在您无法处理异常的情况下,可以使代码更小。@随机地说:虽然在显示日志时通常应该抑制重复的日志项,但在试图跟踪异常似乎“消失”的情况时,它们有时会很有用。我不喜欢一般原则上的捕获和重试(应该有一个“fault”块,它不会假装处理异常),但是将异常的进程记录到调用堆栈中似乎是个好主意。你不认为用一个catch块来捕获异常会更好吗,至少把情况记录下来然后再扔出去?@sheidaei,
try {
    connection = createConnection();
}
finally {
    closeConnection(connection) //Free database connection.
}