捕获 Java 错误

2022-09-01 15:43:35

我听说捕捉被认为是不好的做法。我当前正在加载一个不能保证在 PATH 上的.dll,并且希望切换到用户配置的位置,以防它不是。java.lang.Error

try {
    System.loadLibrary("HelloWorld");
} catch(UnsatisfiedLinkError ule){
    System.load("C:/libraries/HelloWorld.dll");
}

有没有更好的方法来做到这一点?还是抓住这里是可以接受的?UnsatisfiedLinkError


答案 1

除了就如何在技术上克服这个问题提供建议外,我还想花点时间解释为什么它首先被认为是“不良做法”。

让我们从澄清类是什么开始。Error


在java中,会引发错误和异常(它们是主要类型)。抛出上述内容之一是通过使用关键字完成的。每个扩展基本值的类都可以被抛出。throwjava.lang.Throwable

有两个类从基本类继承:和 。这两者之间的区别在他们的文档中进行了解释:ThrowableExceptionError

ErrorThrowable 的一个子类,它指示合理的应用程序不应尝试捕获的严重问题。大多数此类错误都是异常情况。[...]

Exception 及其子类是 Throwable 的一种形式,它指示合理的应用程序可能想要捕获的条件。


如上所述,错误和异常是分开的,因为它们的起源不同。通常表示应用程序无法从中恢复的问题。因此,不应捕获它们。Error

对于 a 也是如此,但它用于指示高级层(例如方法)的问题。而 表示低级问题(例如运行时)。RuntimeExceptionError


因此,既然您已经了解了您只能捕获能够从中恢复的异常和错误,那么您问题的答案应该很清楚。

是的,捕获 是完全合理的,因为您的应用程序可以从中恢复。UnsatisfiedLinkError


在我的博客上的一篇文章中介绍了上述内容(更详细地和示例)和一些扩展信息。


答案 2

您应该只在非常具体的情况下捕获错误。只有当你探索了所有其他可能性时,才会捕获和错误。我完全同意卢卡斯·高德纳所说的一切。但我有一个小的补充。如果您要捕获任何类型的错误,请确保从尽可能窄的范围内捕获错误。此外,如果可能,请确保将捕获错误的方法声明为 final。原因是捕获错误通常会导致一些非常不稳定的程序。假设您在稍后扩展为调用其他方法的方法上捕获了错误,所有这些基础方法现在也会有由覆盖捕获捕获(无意)的错误。

如果您需要捕获错误,请在狭窄的受控 fasion 中执行此操作。


推荐