2016-05-12 55 views
1

我已经创建了一个spring应用程序,其中我已经实现了log4j进行日志记录。我的应用程序中有300多个错误(例外)。我为每个错误创建了单独的用户定义的例外。那些类只是返回错误消息。是否有必要为每个错误创建用户定义的例外

原因创建单独的例外:

  1. 开发者不应该错过了处理任何错误的情况下,当我创建例外,它在默认情况下,他们不得不处理处理的情况显示错误。
  2. 当我通过日志记录时,如果为我的错误场景创建单独的用户定义的异常,记录它时我会更加明了。

现在我想知道:

  1. 是否有必要为每个错误情景个人用户定义的异常?
  2. 大多数人如何更好地处理错误和用户定义的异常?
+1

1. **否**。 2.通过以对开发人员恢复有意义的方式对错误进行分类。堆栈跟踪会告诉你发生异常的位置,所以你不知道为什么要创建300个自定义异常。 –

+0

确实没有必要创建如此多的自定义异常。您可能会发现现有的异常类将足以使用,而不是您创建的许多异常。然后,您可以通过向每个异常的构造函数传递不同的消息和原因来使这些更具体。 https://www.cs.cmu.edu/~pattis/15-1XX/15-200/lectures/exceptions/lecture.html https://docs.oracle.com/javase/7/docs/api/java/郎/ Exception.html –

回答

2

我会很高兴如果你可以用例子更新你的问题。我现在已经构建了很多企业应用程序,我通常遵循的座右铭是确保您的异常类型解释错误的正确类别,并确保您的异常消息正确地解释了错误。除非需要正确分类您正在使用的异常类型,否则不应创建自定义异常。下面是从mabbas一个很好的例子:

When should we create our own java exception classes?

0

我觉得你的问题不能在一个很好的方式来回答;这实际上是在讨论不同的意见。我的意见:只要你的个别例外都是明确的(而不是重叠在他们的意思);每个人都有良好的信息,并随后提供调试问题所需的信息......然后:不要担心。这就是例外情况。更多(和自定义)异常还允许更具体和更精细的错误处理。但是如果使用异常带来严重的代价(在我们的环境中,我们从“独立”节点A向节点B发送异常......而现在,突然之间,您必须确保A,B在匹配的代码级别),事情是不同的。那么你可能会非常仔细地考虑,哪个架构给你最多的“投资回报”。

0

似乎有点过分,可以为300个例外创建300个错误。我所做的是创建我们自己的HttpErrorException类,其中包含我们想要返回的HTTP错误。建议开发人员在遇到异常或错误时抛出其中一个。如果冒出的例外不是新的HttpErrorExceptions之一,则返回500。我们没有将其他异常转换为HTTP错误,因为我认为假定每个特定异常事件总是映射回特定的HTTP错误是错误的。原因是因为有很多依赖关系(我们正在使用的其他库),他们可能会抛出任何类型的异常,对于任何特定的情况,可能无法很好地映射到我们想到的HTTP错误。所以我宁愿明确。

下面是一个典型用法的扼杀例子。

Account getAccount(String id){ 
    Account a = null; 
    try{ 
     a = accountRepo.findById(id); 
    catch(Exception e) { 
     String error = "Got exception while trying to get Account from db."; 
     logger.(error, e); 
     throw new HttpErrorException(500, error); 
     //or throw new HttpErrorException(HttpStatus.INTERNAL_SERVER_ERROR, error); 
    } 
    throw404IfNull(a); 
    return a; 
} 

throwIf404IfNull就是我们创建,以减少我们的代码if语句的简单方法。我们有几种这样的方法,我们的代码保留了if语句,否则它们会被单元测试。

void throw404IfNull(Object obj){ 
    if(obj == null) { 
     throw new HttpErrorException(400, "Object was not found"); 
    } 
} 

我们使用Spring的异常处理功能,所有HttpErrorException的映射到同是在异常的错误状态很好很好格式化的HTTP错误。

相关问题