簡體   English   中英

如何在Java方法中處理多個異常?

[英]How to handle multiple exceptions in a java method?

我讀過處理這樣的多個異常不是最佳實踐:

public void myMethod() throws ExceptionA, ExceptionB, ExceptionC {
    //more code here
}

然后調用myMethod():

try {
    myObject.myMethod();
} catch(Exception e) {
    //More code here
}

盡管Exception是所有其他異常的父類,但它被認為是一種不好的做法。 但是,在我的應用程序中,我使用的是Java SE 6,我需要:

  • 做可能暗示FileNotFOundException和IOException的文件操作
  • 元帥對象(為了創建XML文件)JAXBException
  • 創建一個pdf文件(使用pdfbox庫)COSVisitorException
  • 使用JavaMail發送郵件,MessagingException

最簡單的方法是在方法聲明中添加throws語句,但是編寫客戶端方法的正確方法是什么?

是否可以添加6或7個catch塊來處理所有可能的異常?

一般而言(對於Java 6及更低版本),您應該單獨處理每個異常...

try {
    myObject.myMethod();
} catch (ExceptionA e) {
    // Condition for A
} catch (ExceptionB e) {
    // Condition for B
} catch (ExceptionC e) {
    // Condition for C
}

這使您可以根據異常的不同來處理每個異常,但也意味着您僅在處理據報告由方法拋出的那些異常。

在Java 7+中,您可以使用“多重捕獲”或“組合捕獲”(我們找不到“正式”術語)

try {
    myObject.myMethod();
} catch (ExceptionA | ExceptionB | ExceptionC e) {
    // Condition for A and B and C
}

但是即使那樣,您也應該將異常集中在“通用”使用組上

try {
    myObject.myMethod();
} catch (ExceptionA | ExceptionB e) {
    // Condition for A and B
} catch (ExceptionC e) {
    // Condition for C
}

如果您控制異常的定義方式,另一種選擇是從一個常見的基本異常擴展,一個很好的例子是FileNotFoundException ,它從IOException擴展,由FileReaderFileInputStream拋出(作為示例),這意味着您如果您願意,可以將FileNotFoundException作為常見的IOException處理...

FileReader fr = null;
try {
    fr = new FileReader(new File(...));
    // Read from reader...
} catch (IOException exp) {
    // Common catch block
} finally {
    // Best attempt to close
    try {
        fr.close();
    } catch (Exception exp) {
    }
}

或者您可以處理FileNotFoundException因為它是自己的條件...

FileReader fr = null;
try {
    fr = new FileReader(new File(...));
    // Read from reader...
} catch (FileNotFoundException exp) {
    // File not found condition
} catch (IOException exp) {
    // Other IO condition
} finally {
    // Best attempt to close
    try {
        if (fr != null) {
            fr.close();
        }
    } catch (Exception exp) {
    }
}

這使您既可以將“喜歡”的異常分組在一起,又可以為您提供定義更細粒度條件的控件,如果您需要...

但是請注意,在上面的示例中,如果我將IOException放在首位,則將永遠不會處理FileNotFoundException ,在執行此操作時,請確保首先使用最低/最緊密/最佳的異常,因為它們按順序依次處理列出的

另一個選擇(我不太喜歡,但是已經看到)可能是捕獲一個“共同的”祖先,然后比較實際的類型,這將允許您為異常的某些子類型提供通用的處理程序。

} catch (IOException exp) {
    if (exp instanceof FileNotFound || exp instanceof FileSystemException) {   
        // Common handling
    } else {
        // Generic handling
    }
}

在方法僅拋出祖先類型(即IOException )但您需要提供更精細的分辨率的情況下,這可能會有所幫助

但是,再次,我將專注於僅處理聲明為引發的預期“常見”異常,例如,不要輕易地抓住Throwable

暫無
暫無

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

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