自定義異常
在大多數情況下,從程式碼設計的角度來看,在丟擲異常時使用現有的通用 Exception
類更為簡單。如果你只需要異常來攜帶簡單的錯誤訊息,則尤其如此。在這種情況下,通常首選 RuntimeException ,因為它不是一個經過檢查的 Exception。常見的錯誤類存在其他異常類:
- UnsupportedOperationException - 不支援某個操作
- IllegalArgumentException - 將無效引數值傳遞給方法
- IllegalStateException - 你的 API 在內部達到了一個永遠不會發生的情況,或者由於以無效的方式使用你的 API 而發生的情況
你確實想要使用自定義異常類的情況包括以下內容:
- 你正在編寫供其他人使用的 API 或庫,並且你希望允許 API 的使用者能夠專門捕獲和處理 API 中的異常,並能夠將這些異常與其他更通用的異常區分開來。
- 你在程式的某個部分中丟擲了特定型別錯誤的異常,你希望在程式的另一部分中捕獲並處理這些異常,並且你希望能夠將這些錯誤與其他更通用的錯誤區分開來。
你可以通過為未經檢查的異常擴充套件 RuntimeException
來建立自己的自定義異常,或者通過擴充套件任何不是 RuntimeException 的子類的 Exception
來檢查異常,因為:
不是 RuntimeException 子類的 Exception 子類是已檢查的異常
public class StringTooLongException extends RuntimeException {
// Exceptions can have methods and fields like other classes
// those can be useful to communicate information to pieces of code catching
// such an exception
public final String value;
public final int maximumLength;
public StringTooLongException(String value, int maximumLength){
super(String.format("String exceeds maximum Length of %s: %s", maximumLength, value));
this.value = value;
this.maximumLength = maximumLength;
}
}
這些可以用作預定義的異常:
void validateString(String value){
if (value.length() > 30){
throw new StringTooLongException(value, 30);
}
}
並且可以在捕獲和處理異常的地方使用這些欄位:
void anotherMethod(String value){
try {
validateString(value);
} catch(StringTooLongException e){
System.out.println("The string '" + e.value +
"' was longer than the max of " + e.maximumLength );
}
}
請記住,根據 Oracle 的 Java 文件 :
[…]如果可以合理地期望客戶端從異常中恢復,則將其作為已檢查的異常。如果客戶端無法執行任何操作以從異常中恢復,請將其設定為未經檢查的異常。
更多: