【问题标题】:SonarQube Bug: Method throws alternative exception from catch block without historySonarQube 错误:方法从没有历史记录的 catch 块中抛出替代异常
【发布时间】:2021-12-12 03:35:40
【问题描述】:

在 SonarQube 扫描中,它捕获了一些错误,它说方法捕获了一个异常,并抛出了一个不同的异常,而不包含原始异常。

看下面的代码,

try {

   // something
   // can include nested exceptions...

} catch (CustomException ex) {
   throw ex;
} catch (Exception ex) {
   // Issue is here
   throw new CustomException(HttpStatus.INTERNAL_SERVER_ERROR, "exception message: "+ ex);
}

下面是自定义异常 DTO

class CustomException {
   HttpStatus status;
   String message;
    
   // Getter & Setter....
 }

我可以通过这样做解决这个问题,

catch (Exception ex) {
   CustomException exception = new CustomException(HttpStatus.INTERNAL_SERVER_ERROR, "message" + ex);
   exception.initCause(ex);
   throw exception;
}

上述解决方案很好,但对于目前的情况并不理想,因为那时我必须进行大量更改。

我的问题是,为什么下面的代码不起作用。是因为我将 ORIGINAL CAUSE 作为字符串传递吗?

throw new CustomException(HttpStatus.INTERNAL_SERVER_ERROR, "exception message: "+ ex);

如果“ex”作为字符串传递是问题,那么有没有办法解决它,因为我的 CustomException 只能接受“字符串”字段并且我不能更改任何字段的类型?有什么建议吗?

【问题讨论】:

    标签: java spring-boot sonarqube


    【解决方案1】:

    有时做正确的事情要求你“做出大量的改变”。 SonarQube 是正确的,丢失历史记录(主要是堆栈跟踪)是您代码的真正问题。

    您可以随意忽略该警告或以某种方式禁用它,但您不能仅仅因为它不方便而将其设为“SonarQube 错误”。

    修复它的常用方法是创建另一个(或更改现有)CustomException 类的构造函数;或在它被抛出的每个地方添加原因。这可能需要大量工作,但当您在生产中遇到罕见错误时,它也可以挽救生命 - 您实际上可以看到它的来源。

    【讨论】:

    • 哈哈...谢谢,伙计...
    【解决方案2】:

    通常,自定义异常类有一个重载的构造函数,它接受一个 String 和一个 Throwable,并使用这些参数调用超级构造函数,然后设置任何其他特定于类的属性。然后,您将“+”更改为“,”,这可能会更容易被 SonarQube 接受。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多