簡體   English   中英

你拋出什么樣的異常?

[英]What kind of Exception do you throw?

我有一個方法,它首先在 Environment 中搜索一個變量,如果在那里找不到它,它會搜索config.properties 如果兩者都沒有產生結果,你會拋出什么異常?

NotFoundException聽起來很完美,但它用於在服務器上找不到資源時使用。

那么, RuntimeException(String msg)並在消息中澄清什么?

但是,在閱讀Unchecked Exceptions — The Controversy時,我讀到如果客戶端可以從異常中恢復(他們可以選擇設置默認值或其他內容),我應該使用 Checked Exception。 瀏覽一個異常列表,我找不到合適的,所以我假設我應該拋出Exception

我回答了我自己的問題嗎?

只有在極少數情況下,我才會從我的應用程序代碼中拋出一個預定義的異常。 通常我定義自己的例外,就像@Edwin Dalorzo 建議的那樣。 這使您可以在應用程序的更高層中進行更細粒度的控制,以決定如何處理它。 我至少有兩種不同的類型,一種是致命的(即我無法在應用程序內部處理的故障)和可恢復的故障(即應用程序可以處理的故障)。 示例:如果您的應用程序在沒有該配置變量的情況下無法運行,那么您讓冒泡到應用程序的外層是致命的情況(即 web 應用程序或 Z2567A5EC9705EB7AC2C984033E0618DZ 服務中的 Controller)。 如果某個更高層可以在沒有該變量的情況下工作,那么它不是致命的。 主要區別在於:應用程序本身應該處理它還是只處理最外層?

考慮創建一個擴展 RuntimeException 的異常。 例如, public class BlamException extends RuntimeException... (將其命名為有意義的名稱,例如“BadConfigurationException”)。

許多 RuntimeException “爭議”只是愚蠢的聲稱程序可以從意外的無效 state 中恢復,而這通常(可能只是經常)並非如此。 在缺少配置值的情況下,可能沒有好的默認值。

如果您要允許默認值,則為缺少的配置值實施默認值並記錄一條消息,說明“警告:缺少配置值 blam。使用默認值:kapow”。

100% 你不應該使用 Checked Exception。 Checked Exception 要求程序捕獲並“處理”異常。 在您的情況下,“句柄”部分是“阻止應用程序啟動”,如果您拋出 RuntimeException,就會發生這種情況。

NoSuchElementException怎么樣:

由各種訪問器方法拋出以指示所請求的元素不存在。

我有一個方法,它首先在環境中搜索變量,如果在那里找不到它,它會搜索 config.properties。 如果兩者都沒有產生結果

這聽起來不是很適合定義你自己的Exception嗎? 讓我們在這里看一個情況:

您正在為銀行開發應用程序,並且您想驗證用戶是否說A想要向另一個用戶匯款的用戶說B
所以在轉賬之前,我們會檢查A是否有這么多的金額,如果他/她有那么我們將繼續交易。
什么是A沒有那么多平衡? 作為負責任的開發人員,您將通知A 這里有很多方法來處理它。 但我更喜歡在這里定義我自己的例外。 InsufficentBalanceException(int amount)

您可以通過編寫包裝器 class來使用未經檢查的異常,如果您正在處理資源,它將使用自定義消息擴展RuntimeException class

總體而言,您需要將異常傳播到應用程序級別,因為在啟動應用程序時配置確實很重要。

例子

ErrorClass.java

public type doSomething(){
...
...
try{
   ...
} catch(FileNotFoundException e){
throw new MyCustomFileNotFoundException("config file not found", e); // no destructive wrapping here
}
}

MyCustomFileNotFoundException.java

public class MyCustomFileNotFoundException extends RuntimeException{
    public MyCustomFileNotFoundException(String msg, Throwable cause){
    super(msg, cause);
    }
}

暫無
暫無

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

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