Java,特定于类的异常与标准异常

2022-09-03 17:47:39

我一直在更新现有库以引发异常,以帮助改进使用该库的人员的调试。

起初,我以为我会定义特定于每个类的异常,但是事实证明,大多数这些异常只是具有特定消息的现有运行时异常(例如,,)的扩展。FooNegativeIntArgumentException extends IllegalArgumentExceptionFooNullBarException extends NullPointerException

定义新异常与使用现有异常的权衡是什么?是否有任何约定/最佳实践?

此外,考虑到向后兼容性的需要,这些异常中的大多数(如果不是全部)都是运行时异常。


答案 1

以下是我对为什么我们有不同类型的异常以及何时创建自定义异常类型的看法(注意:这使用.NET类型作为示例,但相同的原则适用于Java和任何其他使用结构化错误处理的语言)。在这里发布完整答案可能太长了,所以我只发布两个关键摘录。

  1. 何时引发不同类型的异常?为每个症状引发不同类型的异常,这些异常可以通过编程方式以不同的方式进行处理。

  2. 何时创建自定义异常类型?当您需要使用其他信息批注异常以帮助以编程方式处理症状时,请创建自定义异常类型。

在你的情况下,听起来不像你的自定义异常类型正在填补可以使用标准异常传达的症状中的空白,并且它们没有为编程处理添加任何其他信息,因此不要创建它们。只需使用标准版本即可。


答案 2

在不增加任何价值的情况下扩展异常是完全浪费时间,并且会产生最能避免的持续维护成本。

使用标准例外。

这并不是说你永远不应该使用自定义例外,只是不要在你提出的用例中使用。

此外,在创建自定义异常时,它们应与导致它们的条件相关,而不是与可能引发它们的类相关。将它们与业务/功能区域相关联是可以的,因为导致异常的错误条件可能以这种方式相关,并且它将提供有用的过滤技术。