以编程方式区分异常

Ant*_*ony 2 java exception-handling

异常的类型通常足以正确处理它(例如,您尝试打开文件并获取a FileNotFoundException).但是,在某些情况下,您可能会捕获同一类型的多个异常.例如,一个IllegalArgumentException可能由多个参数引起的.这IllegalArgumentException不会向Throwable接口添加任何其他方法(或公共字段)(根据在线javadoc),这意味着您可以依赖的唯一信息是嵌套异常(可能存在也可能不存在)和消息(是供人食用的).

我不喜欢扩展IllegalArgumentException为其添加结构化信息的想法,因为其他人必须学习新课程.而且我不喜欢乱扔乱画项目的想法非常具体的异常类.使用消息字段也是一个坏主意,因为它不适用于编程访问.

我认为IllegalArgumentException应该包括诸如类函数和有争议的参数之类的细节.通常,自定义异常应该提供额外的细节(除了它们的类型之外),以便进行更细粒度的异常处理.

什么通常被认为是设计异常类和处理相同类型的异常的最佳实践?

And*_*yle 5

作为一般规则,我认为每个"调用者可能合理想要采取的行动类型"都有一类异常理想的.当然,对于一个人自己的自定义异常,可能有一个布尔或枚举字段提供一些额外的消歧,而不是创建琐碎的子类.

在您的具体情况下,我不相信尝试处理异常是一个好主意. RuntimeException它的子类通常代表编码问题,同样如此IllegalArgumentException.如果参数是非法的,则不应该首先传入.

如果您处于一种您不确定参数是否有效的情况(可能是用户输入,或者您可能不知道您正在调用该方法的特定对象),那么更好的方法是在传递参数之前检查参数有效性的一些方法.而不是说"做这个"并抓住异常,问"我可以这样做吗?" 在打电话之前