簡體   English   中英

更改方法拋出Java的異常類型

[英]Changing the type of Exception a method throws in Java

我想做的事情感覺反直覺,但Java一直讓我感到驚訝,所以我試一試。

我正在ESAPI庫的幫助下實現一個應用程序。 該庫提供了自己的例外。 除了眾所周知的異常行為之外,這些異常還會執行諸如使用log4j自動記錄和向入侵檢測模塊提供信息之類的操作。

現在我想在我的應用程序的所有部分中使用這些功能。 無論何時我的方法拋出異常,我都不會拋出正常的異常,而是從新的EnterpriseSecurityException擴展的自制異常。 奇跡般有效。

但是,如果我使用一種拋出正常異常的方法,我該怎么辦? 假設我想使用java.io.FileInputStream讀取文件? 它找不到該文件並拋出FileNotFoundException。 不幸的是,FileNotFoundException不提供我自己的異常的功能,因為它不會擴展EnterpriseSecurityException。

Java中是否有任何技巧可以更改方法拋出的異常? 我寫這篇文章時聽起來很奇怪,但也許有人可以提出解決方案。 到目前為止,我唯一的想法是捕獲正常的異常,提取相關信息,並用它構建一個新的異常。 但這看起來很粗糙......

捕獲異常並拋出一個從EnterpriseSecurityException擴展的新異常,並將舊異常傳遞給新異常以將它們鏈接在一起

try {
    ...
} catch (FileNotFoundException e) {
    throw new CustomEnterpriseSecurityException(e);
}

通過鏈接異常,您不會丟失原始異常的堆棧跟蹤。

也許你可以這樣做:

try{
// file operations
}catch(FileNotFoundException e){
 throw new MyCustomeFileNotFoundException(e);
}

為預定義的異常創建異常版本,並在catch中獲得任何預定義的異常時拋出定義的異常。

你可以這樣做。 只需捕獲原始異常並拋出您自己定義的適當異常,並擴展EnterpriseSecurityException。 確保鏈接異常以使堆棧跟蹤不會丟失。

例如,使用您的文件打開示例:

 try {
      //open file
    } catch (FileNotFoundException e) {
       throw new YoureCustomException("This is your message", e);
    }

我發現一種非常有用的技術是使用Exception(Throwable cause)構造函數作為超類構造函數來鏈接異常。 這樣,您不會丟失任何堆棧跟蹤,但可以在您自己的類中提供自定義處理(如果願意,可以使用getCause()方法查看原因)。 例如:

try{
    //do something
}
catch(FileNotFoundException e){
    throw new MyFileNotFoundException(e);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM