簡體   English   中英

Java如何“覆蓋”捕獲塊

[英]Java How to “Override” a catch block

我有辦法 此方法有一個catch塊。

// pseudo code
private void function() {
    try {
        // something
    } catch(exception e) {
        // error handling
    }
}

在另一類中調用此方法。在一種情況下,該類使用其自己的catch塊實現。

// pseudo code
private void anotherFunction() {
    try {
        function(); 
    } catch {
        //another catch block
    }

現在,我只想在調用該函數的catch塊中執行代碼,而不要調用該類中實現的catch塊。 有沒有辦法做到這一點,或者我應該考慮另一種方法嗎?

一種解決方法是將您的邏輯移至另一種不處理該異常的方法,而只是將其向上傳遞,例如:

public void unsafeFunction() throws Exception{
    // something
}

然后從兩個類中調用該方法,這兩個類對異常的處理方式不同:

public void function(){
    try {
        unsafeFunction();
    } catch(Exception e){
        // error handling
    }
}

和:

public void anotherFunction(){
    try {
        unsafeFunction();
    } catch(Exception e){
        // other error handling
    }
}

這樣一來,您就可以將調用者的例外情況留給調用者。


另一種完全不同的方法是使用Java 8中的java.util.function.Consumer接口並接受您的function ,然后調用者可以將錯誤處理程序傳遞給它:

public void function(Consumer<? super Exception> errorHandler){
    try{
        // something
    } catch(Exception e){
        // delegate to handler
        errorHandler.accept(e);
    }
}

然后可以這樣使用:

public void someFunction(){
    function(e -> {
        // error handling
    });
}

和:

public void anotherFunction(){
    function(e -> {
        // other error handling
    });
}

一定有理由捕獲異常。 說原因可以用另一種方法進行測試:

private boolean testCircumstanceThrowingException() {
    if (exceptionalCircumstance) {
        return false;
    } else {
        return true;
    }
}

那么您可以將原始功能實現為:

private void functionCatchingException(){
    if (testCircumstanceThrowingException()) {
        //error handling
    }

    function();
}

private void anotherFunction() {
    if (testCircumstanceThrowingException()) {
        //error handling
    }

    function();
}

這樣,在應用程序正常運行期間,不會引發任何異常。 這是應該的,因為例外是針對特殊情況的 如果您以某種方式進入了預期會出現異常的狀態,則說明出現了問題。

如果沒有其他方法,則應僅依靠競爭。 例如,如果您對function特定使用無法測試異常情況,則需要使用function 查看Lino的答案,以了解可能的解決方法。


Java純粹主義者會注意到,您可以簡單地return exceptionalCircumstance; 但是此代碼只是為了表明可能需要測試異常情況的函數; 結果甚至可能不是布爾值。

當然,您現在可能想要重命名functionCatchingException :)

在您的第一個代碼段中:

private void function() {
    try {
        // something
    }
    catch (Exception e) {
        // error handling
        throw e; // rethrow?
    }
}

Java基本上有兩種選擇。 您可以吞下該異常,也可以將其重新拋出。 如果吞下它,則此方法的調用者將不會看到異常。 如果您重新拋出,則調用方也將獲得異常。

如果這些行為都不是您真正想要的,那么您可能需要重新考慮您的設計。

您可以使用關鍵字throw將異常拋出給調用方方法:

private void function(){
    try{
       //something
    } catch(Exception e){
       //error handling
       throw e;
    }
}

然后您的anotherFunction() catch塊將被執行。

您可以從這里了解更多信息: Java教程

暫無
暫無

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

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