使用适当的错误消息映射J2EE网站中出现的错误(异常)的有效方法是什么?

时间:2014-12-04 07:41:42

标签: java java-ee web exception-handling

我正在为一个迷你项目开发一个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()方法来检查异常类型,这是一种很好的做法(在性能,可伸缩性和代码标准方面) ?

1 个答案:

答案 0 :(得分:1)

  

每个异常分支都代表特定情况下发生的异常   该网站的一部分。

但是如果异常发生在网站不同部分共享的公共组件中会怎样?

例外已经告诉你他们发生了什么(这是堆栈跟踪的用途),你不需要把它放在名字中。该名称是出于例外的原因(例如IllegalArgumentExceptionEOFException

您的设计在很多方面都很差。您应该尽可能地处理异常,可以在本地使用特定的错误消息(如果让用户想要选择已经采用的用户名),也可以全局处理一般错误消息。

编辑: 应用程序中存在数千种潜在的错误情况。您可以根据您可以对它们执行的操作将它们分为几类。假设您尝试将重复的用户名插入数据库,并抛出异常。你抓住这个并告诉用户选择不同的用户名。

这是最不常见的情况,您甚至可以通过检查用户名是否存在来绕过此问题,而不是依赖于例外。

然后你有点特别,让我们说你根本无法连接到数据库。你不知道为什么,但是你仍然准备好了,你告诉用户数据库出了问题,请再试一次。

然后你就是最特别的。你还没准备好它,你没有它的catch子句,它飞到全局异常处理程序。您所能做的就是向用户显示一条错误消息"出现问题",记录错误,并通知维护团队。

现在,设计例外的方式取决于您了解发生的事情的信息量。您可能有一个DatabaseException类用于所有与DB相关的错误,而DuplicateUserException可以扩展它以提供更多详细信息。另请注意,DuplicateUserException永远不会传播到全局异常处理程序。您可以直接处理它,向用户显示错误消息。您从资源包中获取的错误消息不是异常的名称,而是一般密钥,例如" exception.user.duplicate"。

我认为你的基本错误是认为你可以创建一个负责异常处理的地方,只是基于异常类型。我建议你放弃这个想法。全局处理程序应该只在其他人没有时才处理(主要是记录)异常。