免责声明:我来自 C# 世界,所以这个问题可能因我之前的经验而有偏差我有一个初始化日志记录的方法。如果失败,应用程序的其余部分不应运行,因为对记录器的任何调用都会抛出 NullPointerException。今天,我的代码捕获异常并通过 System.err 打印错误日志。对我来说,这是一个错误,它应该让异常传播直到它杀死应用程序。因此,我开始删除 try catch,突然收到编译器的抱怨,说我应该在调用此方法的整个堆栈上声明我的异常。我理解它背后的逻辑,并且发现它很实用:你知道这种方法是如何失败的。然而,就责任分离而言,这对我来说听起来并不正确。我不希望上层意识到这种潜在的 IOException 失败,这是一种非常特殊的行为,例如 main 方法不应该知道。而且,如果我们推动这个逻辑,那就意味着:最高层最终必须声明异常的整个范围(从 IO 到网络再到自定义异常......)任何新异常的添加都可能会影响大量文件和代码我是否遗漏了什么或者这是预期的异常设计?
3 回答
幕布斯7119047
TA贡献1794条经验 获得超8个赞
我认为你正在寻找的不是 Java 异常,而是 Java 错误。
Error 是 Throwable 的子类,它指示合理的应用程序不应尝试捕获的严重问题。大多数此类错误都是异常情况。ThreadDeath 错误虽然是“正常”情况,但也是 Error 的子类,因为大多数应用程序不应尝试捕获它。
https://docs.oracle.com/javase/7/docs/api/java/lang/Error.html
您可以抛出一个错误,这表明您的应用程序将不再工作,而您已将其声明为正确的行为。
ibeautiful
TA贡献1993条经验 获得超5个赞
如果您无法初始化记录器并且这是一个企业应用程序,我建议使用解释原因的退出代码来终止您的应用程序。如果这是客户端应用程序,我建议向客户端显示一条消息,说明问题,建议客户端向您报告此问题,并允许他们选择是否继续
米脂
TA贡献1836条经验 获得超3个赞
您可以将检查的异常封装在 RuntimeException 中(如果是其子异常,则将其封装在 RuntimeException 中),这不会强制您声明异常:
public X execute() {
try {
return someThrowingMethod();
} catch (Exception ex) {
throw new RuntimeException(ex);
}
}
添加回答
举报
0/150
提交
取消