我在某处读到(现在找不到)大型异常层次结构是浪费时间.这个陈述的理由似乎在当时是合理的,这个想法一直困扰着我.
在我自己的代码中,当我有一个可以有一系列错误条件的代码库时,我使用一个枚举成员的异常来区分它们.
如果出现我需要抓住其中一个错误的情况,我会抓住它,检查枚举并重新抛出是否不是我所期望的.理想情况下,这应该是罕见的.
我再次处理异常,我有一个反思的时刻,我质疑我的异常习惯.我很好奇其他人做了什么,为什么?
数据成员的层次结构或一个例外.
顺便说一句,我假设您同意异常与错误代码的想法.我不想打开那种虫子.
简单的经验法则:
如果您在检查异常后最终重新抛出异常,那么您需要一个更精细的异常层次结构(除了极少数情况下,检查需要相当多的逻辑).
如果您有从未捕获的异常类(只有它们的超类型),那么您需要一个不太精细的异常层次结构.
我认为只有一个嵌入枚举的异常类型是次优的:
您不得不经常捕获异常(并在确定无法处理之后重新抛出异常)
枚举本身就变成了一个变化的热点(所有程序员都需要定期修改它)
枚举不是分层的,因此例如,您无法轻松地使用一个处理程序处理所有IO错误
有时您还希望为调用者提供除错误消息文本之外的其他信息,例如,未找到的文件的路径或从SQL Server接收的错误号.将所有可能的错误场景中的这些附加信息放入同一个异常中会使处理变得更加麻烦.
要回答你的问题,我正在使用异常层次结构.它比它的深度要广泛得多.
你不应该对此有教条.使用最适合手头问题的东西.我的经验法则如下:
仅在需要需要不同行为的异常时才创建新的Exception类.
相反,当您只想要包含异常的额外信息时,请将内容(枚举,错误代码等)添加到异常类中
除非确实需要,否则不要创建新类.记得,YAGNI ......