Java异常设计:必须捕获或声明抛出=>代码影响太大

免责声明:我来自 C# 世界,所以这个问题可能因我之前的经验而有偏差

我有一个初始化日志记录的方法。如果失败,应用程序的其余部分不应运行,因为对记录器的任何调用都会抛出 NullPointerException。

今天,我的代码捕获异常并通过 System.err 打印错误日志。对我来说,这是一个错误,它应该让异常传播直到它杀死应用程序。

因此,我开始删除 try catch,突然收到编译器的抱怨,说我应该在调用此方法的整个堆栈上声明我的异常。

我理解它背后的逻辑,并且发现它很实用:你知道这种方法是如何失败的。

然而,就责任分离而言,这对我来说听起来并不正确。我不希望上层意识到这种潜在的 IOException 失败,这是一种非常特殊的行为,例如 main 方法不应该知道。而且,如果我们推动这个逻辑,那就意味着:

  1. 最高层最终必须声明异常的整个范围(从 IO 到网络再到自定义异常......)

  2. 任何新异常的添加都可能会影响大量文件和代码

我是否遗漏了什么或者这是预期的异常设计?


BIG阳
浏览 109回答 3
3回答

幕布斯7119047

我认为你正在寻找的不是 Java 异常,而是 Java 错误。Error 是 Throwable 的子类,它指示合理的应用程序不应尝试捕获的严重问题。大多数此类错误都是异常情况。ThreadDeath 错误虽然是“正常”情况,但也是 Error 的子类,因为大多数应用程序不应尝试捕获它。https://docs.oracle.com/javase/7/docs/api/java/lang/Error.html您可以抛出一个错误,这表明您的应用程序将不再工作,而您已将其声明为正确的行为。

ibeautiful

如果您无法初始化记录器并且这是一个企业应用程序,我建议使用解释原因的退出代码来终止您的应用程序。如果这是客户端应用程序,我建议向客户端显示一条消息,说明问题,建议客户端向您报告此问题,并允许他们选择是否继续

米脂

您可以将检查的异常封装在 RuntimeException 中(如果是其子异常,则将其封装在 RuntimeException 中),这不会强制您声明异常:public X execute() {    try {        return someThrowingMethod();    } catch (Exception ex) {        throw new RuntimeException(ex);    }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java