我正在对遗留系统进行维护,并且在许多地方都看到了类似于以下内容的块:
try {
// aqui codigo
} finally {
// mas codigo aqui
}
我的问题是:制作try .. finally
, 没有块的功能是什么catch
?
我正在对遗留系统进行维护,并且在许多地方都看到了类似于以下内容的块:
try {
// aqui codigo
} finally {
// mas codigo aqui
}
我的问题是:制作try .. finally
, 没有块的功能是什么catch
?
合约是算法正确性设计和分析中的一个常见概念。概念是我们程序的函数、方法或其他单元必须具有:
在这个框架中,这
try { ... } finally { ... }
是一个有用的构造,因此我们的代码可以保证后置条件,即使在 del 块try { ... }
中或在该块中调用的任何方法中发生异常时也是如此。由于块内的命令finally { ... }
总是会被执行,无论是否异常,通常将代码放在那里保证后置条件。其他人给出的“清洁”的例子都属于这个框架。这个想法是在这些例子中:
finally
这是旧版本 Java 中最常见的用法。在 Java 7 中,引入了一种新的构造,称为“try with resources”,它取代了try { ... } finally { ... }
最常见的用法:另一种示例是线程(“线程”)之间的同步工具。在包
java.util.concurrent.locks
中有几种锁(“锁”),通常用于try {...} finally {...}
:但值得再次强调后置条件的概念。毕竟,这
try { ... } finally { ... }
并不是一种专门的“清理”机制,而是一种便于组合正确程序的通用工具。所以它还有其他用途,即使它们比这两种用途少得多。可以添加其他示例。编程错误的常见原因是函数或方法的提前退出(“提前返回”)。典型的情况是这样的:
假设我们总是需要调用方法
cosaQueSiempreTieneQuePasar()
,这个例子有一个错误:当它noSéQué()
返回时true
我们提前退出并忘记调用cosaQueSiempreTieneQuePasar()
。许多情况下的解决方案如下:这里需要注意的是,虽然很多答案都提到了异常作为 的原因,但
try {...} finally {...}
这个例子表明,即使没有异常,我们也会遇到问题。其他示例也可以使用break
和continue
重复结构,例如for (...) {...}
.或者更确切地说,异常、
return
early、thebreak
和 thecontinue
有一些共同点——代码块的提前退出——并且finally
是所有这些导致的问题的常见解决方案。显然这不是一个糟糕的做法,因为
finally
将始终运行可用于清洁。我在网上找到了几个例子:示例 1
示例 2
这里用户说,在下面的示例中,
catch
他不知道如何处理该错误,因此最好添加一个清理例程。该块
catch
仅用于捕获在代码执行期间出现的任何异常。由于没有 blockcatch
,所以该代码块所在方法的客户端会抛出异常并处理。如果没有处理这个异常,那么异常会跳转到它可以达到的最高级别。如果最高级别是public static void main(String[] args)
应用程序方法并且没有在那里处理,那么应用程序将显示已抛出的异常并“终止”。需要注意的
finally
是,无论异常是否被抛出到应用程序的最高层,该块总是被执行。在某些情况下它不会运行finally
,但它们在此答案之外。你可以在这里看到它们try-finally
当您的代码不需要处理异常时使用,因为已经存在另一个级别来处理它。例如,在一个 Web 应用程序中,您有一些 X 组件来装饰执行请求的组件,并且 X 已经有一种默认处理异常的方法,它会自动记录它们并向用户显示“好”消息(我不知道哪个错误消息实际上很漂亮)。这个例子的一个例子(原谅冗余)是 Spring MVC 的例子,你可以用它@ControllerAdvice
来处理一般级别的异常。这样,如果你的代码抛出异常,就不会由代码本身来处理,而是由被这个注解修饰的类来处理。这不是一个坏习惯,这是一个顺序问题。
正如其他人已经提到的,
try
withfinally
用于在发生异常时进行清理,而不捕获该异常。从 Java 7 开始,您已经尝试使用资源,甚至可能已经存在仅包含以下内容的块
try
:剩下
finally
的,因为流将关闭结束块。它可以用于如果失败,不需要通知或提醒用户的流程。但这是一个不好的做法,至少你应该在catch中记录一个异常日志
完整的子句是:Try、Catch 和 finally。他们可能没有使用错误捕获块,因为没有必要发出任何类型的通知......但是,您应该将其添加到将来,以便更好地确定问题发生的原因和位置。
System.out.println("Salgo de la funcion Clase1.pepito()");