在 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 作為 STRING傳遞嗎?
throw new CustomException(HttpStatus.INTERNAL_SERVER_ERROR, "exception message: " ex);
如果作為字串傳遞的“ex”是問題,那么有沒有辦法解決它,因為我的 CustomException 只能采用“字串”欄位,而我不能更改任何欄位的型別?有什么建議嗎?
uj5u.com熱心網友回復:
有時做正確的事情需要你“做出大量的改變”。SonarQube 是正確的,丟失歷史記錄(主要是堆疊跟蹤)是您代碼的真正問題。
您可以隨意忽略警告或以某種方式禁用它,但您不能僅僅因為它不方便而將其設為“SonarQube 錯誤”。
修復它的常用方法是創建另一個(或更改現有的)CustomException類的建構式 ;或者在它被拋出的每個地方添加原因。這可能需要大量作業,但當您在生產中遇到罕見的錯誤時,它也可以成為救命稻草 - 您實際上可以看到它的起源。
uj5u.com熱心網友回復:
通常,自定義例外類具有多載建構式,該建構式采用 String 和 Throwable,并使用這些引數呼叫超級建構式,然后設定任何其他特定于類的屬性。然后,您可以將“ ”更改為“,”,這對于 SonarQube 來說可能更容易接受。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/337927.html
下一篇:SpringSecurityBCryptPasswordEncoder:編碼后的密碼看起來不像使用相同密碼的BCrypt
