自定義異常

在大多數情況下,從程式碼設計的角度來看,在丟擲異常時使用現有的通用 Exception 類更為簡單。如果你只需要異常來攜帶簡單的錯誤訊息,則尤其如此。在這種情況下,通常首選 RuntimeException ,因為它不是一個經過檢查的 Exception。常見的錯誤類存在其他異常類:

確實想要使用自定義異常類的情況包括以下內容:

  • 你正在編寫供其他人使用的 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 文件

[…]如果可以合理地期望客戶端從異常中恢復,則將其作為已檢查的異常。如果客戶端無法執行任何操作以從異常中恢復,請將其設定為未經檢查的異常。

更多: