在 Java 中定义自定义异常有什么重要的理由吗?
6 回答
两个原因立即浮现在脑海:
- 简单地说,您不必说
try { ... } catch (Exception e) { ... }
- 拥有自己的子类可以让您分别处理不同的异常情况。(比如没有权限运行报表和报表执行失败的区别)。 - 您可以添加额外的上下文 - 例如,如果您有自己的
AlreadyLoggedInException
,例如,该异常可以具有检索启动另一个会话的 IP 地址的方法。或者一个AccountLimitExceededException
可以包含当前帐户限制。异常中的额外信息使您在捕获它时可能会采取更明智的响应。
提供特定于错误的信息,允许更细粒度的异常处理程序。
很简单,它允许您以正确的方式处理每个异常。
考虑以下代码
try {
doSomethingThatCouldThrowManyExceptions();
}
catch (ExceptionalCircumstance1 ex) {
// deal with this specific circumstance
}
catch (ExceptionalCircumstance2 ex) {
// deal with this specific circumstance
}
catch (ExceptionalCircumstance3 ex) {
// deal with this specific circumstance
}
finally {
// do some common code
}
如果没有这个,你将不得不尝试做一个包罗万象的异常。
但是,如果一个包罗万象,那么类层次结构仍然意味着您仍然可以使用catch(Exception ex) {}
.
是的。最大的优势是它允许你抛出和异常意味着你想要它们的意思。如果您重用现有异常,则捕获异常的任何代码都必须处理实际异常不是由您的代码引发的可能性,而是由其他一些库方代码引发的。这往往会使错误处理更加不稳定。
使用自定义异常,您可以告诉调用者发生了特定类型的错误,而不仅仅是错误。因此,调用者可能会针对这种错误执行特定的操作。
让我们用一个汽车类比:你喜欢你的汽车拒绝以独特的红灯闪烁,还是专用的“油箱空”灯闪烁?
在我看来,自定义异常的主要动机是实现对应用程序域的更好建模。在设计类时,您会花费大量精力来命名对象并分配它们的职责。我认为在这一点上考虑可能的错误条件是一项很好的投资。例如,在深入挖掘时,客户通常可以给您一些必须处理的常见示例(例如无效数据、违反逻辑约束、不可靠的传感器等)。因此,您将拥有更易于理解和修改的代码。应用程序特定的错误被很好地分开,并且可以轻松实现对其他错误的处理。
另一点是它可能为系统的不同部分提供更好的抽象。例如,如果你真的预计持久化部分的实现会在未来发生变化,那么在其 API 中使用自定义异常要好得多。否则,您以后将在许多不同的地方处理 SQLException 或 SAXExceptions 有很多乐趣:-)