在Java中定义自定义异常的任何重要原因?
答案 0 :(得分:12)
立即想到两个原因:
try { ... } catch (Exception e) { ... }
- 拥有自己的子类可以让您分别处理不同的异常情况。 (例如,无权运行报告与报告执行失败之间的区别)。AlreadyLoggedInException
,那么该异常可以有一个方法来检索启动其他会话的IP地址。或者AccountLimitExceededException
可以包含当前帐户限制。异常中的额外信息使您可以在捕获时获得更明智的响应。答案 1 :(得分:2)
提供特定于错误的信息,允许更细粒度的异常处理程序。
答案 2 :(得分:2)
很简单,它允许您以正确的方式处理每个异常。
考虑以下代码
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-all会这样做,那么类层次结构仍然意味着您仍然可以使用catch(Exception ex) {}
捕获所有异常。
答案 3 :(得分:1)
是。最大的优点是它允许你抛出和异常意味着你希望它们意味着什么。如果您重用现有的异常,那么捕获异常的任何代码都必须处理代码不会抛出实际异常的可能性,而是处理其他一些库方代码。这往往会使错误处理更加轻松。
答案 4 :(得分:0)
使用自定义异常,您可以告诉调用者发生了特定类型的错误,而不仅仅是错误。因此,呼叫者可能会对此类错误采取任何措施。
让我们用一个汽车比喻:你更喜欢你的车拒绝以独特的红灯闪烁开始,或者专用的“油箱空”灯闪烁吗?
答案 5 :(得分:0)
在我看来,自定义异常的主要动机是实现对应用程序域的更好建模。在设计类时,您需要花费大量精力来命名对象并分配其职责。我认为,在这一点上,考虑可能的错误条件的一些努力是一个很好的投资。例如,当深入挖掘时,客户端通常可以为您提供一些必须处理的常见示例(例如,无效数据,违反逻辑约束,不可靠的传感器等)。因此,您将拥有更易于理解和修改的代码。特定于应用程序的错误可以很好地分离,并且可以轻松实现对其他错误的处理。
另一点是它可能为系统的不同部分提供更好的抽象。例如,如果您真的预计持久性部分的实现将来会发生变化,那么在其API中使用自定义异常要好得多。否则,您将在很多不同的地方处理SQLException或SAXExceptions后会有很多乐趣: - )