[英]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,我需要:
最簡單的方法是在方法聲明中添加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
擴展,由FileReader
和FileInputStream
拋出(作為示例),這意味着您如果您願意,可以將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.