免责声明:我来自 C# 世界,所以这个问题可能会因我以前的经验而产生偏见
我有一个初始化日志记录的方法。如果失败,则应用程序的其余部分不应运行,因为对 logger 的任何调用都将抛出 NullPointerException。
今天,我的代码正在捕获异常并通过 System.err 打印错误日志。对我来说,这是一个错误,它应该让异常传播直到它杀死应用程序。
所以我开始删除 try catch 并且我突然收到编译器的抱怨说我应该在调用此方法的整个堆栈上声明我的异常。
我理解它背后的逻辑,并且过去认为它很实用:你知道这种方法是如何失败的。
但是,就责任分离而言,这对我来说听起来并不正确。我不希望上层意识到这种潜在的 IOException 失败,这是一种非常特殊的行为,例如 main 方法不应该知道。而且,如果我们推动这个逻辑,这意味着:
我是否遗漏了什么,或者这是有意的异常设计?
我认为您要查找的不是 Java 异常,而是 Java 错误。
Error 是 Throwable 的一个子类,它指示合理的应用程序不应尝试捕获的严重问题。大多数此类错误是异常情况。ThreadDeath 错误虽然是“正常”情况,但也是 Error 的一个子类,因为大多数应用程序不应该尝试捕获它。
https://docs.oracle.com/javase/7/docs/api/java/lang/Error.html
您可以抛出一个错误,表明您的应用程序将不再工作,您将其声明为正确的行为。