我正在为一个迷你项目开发一个J2EE网站,我对异常处理感到困惑。我已经定义了几个自定义异常类,它们是从网站的几个部分抛出的,它们是在自定义异常处理程序中捕获的。但是,我还没有找到一种将发生的异常映射到错误消息的好方法。
简单地说,如果异常发生在某处,我有一个全局异常处理程序,它捕获抛出的异常(我不会在本地catch块中吞下它),但我需要一个有效的机制,通过它我应该能够将其转换为适当的错误消息,以显示给最终用户。
此外,自定义异常具有树层次结构,这意味着树的顶部将具有一般异常,并且树的叶子将具有为特定目的定义的异常。
树就像
CustomException
Type1Exception
Type11Exception
Type12Exception
Type121Exception
Type122Exception
Type13Exception
Type2Exception
Type21Exception
Type211Exception
Type22Exception
Type3Exception
Type31Exception
Type32Exception
Type33Exception
Type4Exception
Type41Exception
Type411Exception
Type4111Exception
Type4112Exception
Type421Exception
Type4211Exception
Type42Exception
每个异常分支都代表网站特定部分发生的异常。如果向网站添加更多功能,那么将来树的增长会更多。将一堆例外映射到错误消息的最佳做法是什么?
而且,正在使用 instanceOf 运算符和 isInstance()方法来检查异常类型,这是一种很好的做法(在性能,可伸缩性和代码标准方面) ?
答案 0 :(得分:1)
每个异常分支都代表特定情况下发生的异常 该网站的一部分。
但是如果异常发生在网站不同部分共享的公共组件中会怎样?
例外已经告诉你他们发生了什么(这是堆栈跟踪的用途),你不需要把它放在名字中。该名称是出于例外的原因(例如IllegalArgumentException
或EOFException
。
您的设计在很多方面都很差。您应该尽可能地处理异常,可以在本地使用特定的错误消息(如果让用户想要选择已经采用的用户名),也可以全局处理一般错误消息。
编辑: 应用程序中存在数千种潜在的错误情况。您可以根据您可以对它们执行的操作将它们分为几类。假设您尝试将重复的用户名插入数据库,并抛出异常。你抓住这个并告诉用户选择不同的用户名。
这是最不常见的情况,您甚至可以通过检查用户名是否存在来绕过此问题,而不是依赖于例外。
然后你有点特别,让我们说你根本无法连接到数据库。你不知道为什么,但是你仍然准备好了,你告诉用户数据库出了问题,请再试一次。
然后你就是最特别的。你还没准备好它,你没有它的catch子句,它飞到全局异常处理程序。您所能做的就是向用户显示一条错误消息"出现问题",记录错误,并通知维护团队。
现在,设计例外的方式取决于您了解发生的事情的信息量。您可能有一个DatabaseException
类用于所有与DB相关的错误,而DuplicateUserException
可以扩展它以提供更多详细信息。另请注意,DuplicateUserException
永远不会传播到全局异常处理程序。您可以直接处理它,向用户显示错误消息。您从资源包中获取的错误消息不是异常的名称,而是一般密钥,例如" exception.user.duplicate"。
我认为你的基本错误是认为你可以创建一个负责异常处理的地方,只是基于异常类型。我建议你放弃这个想法。全局处理程序应该只在其他人没有时才处理(主要是记录)异常。