捕獲Throwable將捕獲所有異常(包括RuntimeExceptions)和所有錯誤。不建議捕獲任何父Throwables(Throwable,Error,Exception或RuntimeException),但如果方法拋出過多檢查異常或拋出Exception,則發現此情況並不少見。
在某些API中將方法記錄爲拋出異常並不罕見。這以控制爲代價提供了一些靈活性。我喜歡定義一個新的Exception類來處理這種情況,但這是個人偏好。
以下簡單類顯示了可拋出類型和相應的catch塊的示例。
public class ThrowableExamples {
public static void main(String[] args) {
try {
// throw new NoSuchMethodException("Exception");
// throw new Exception("Exception");
// throw new IllegalStateException("RuntimeException");
// throw new RuntimeException("RuntimeException");
throw new NoSuchMethodError("Error");
// throw new Error("Error");
// throw new Throwable("Throwable");
} catch (RuntimeException e) {
System.out.println("Caught RuntimeException: " + (e.getMessage().equals("RuntimeException") ? "Expected" : "Unexpected"));
} catch (Exception e) {
System.out.println("Caught Exception: " + (e.getMessage().equals("Exception") ? "Expected" : "Unexpected"));
} catch (Error e) {
System.out.println("Caught Error: " + (e.getMessage().equals("Error") ? "Expected" : "Unexpected"));
} catch (Throwable e) {
System.out.println("Caught Throwable: " + (e.getMessage().equals("Throwable") ? "Expected" : "Unexpected"));
}
}
}
我使用這種問題作爲一種方法來清除我不想工作的地方,或者是因爲現有的代碼必須太棘手,或者管理員過於執着於他們知道他們下屬使用的編程語言的一些瑣事,或者更糟糕的東西... –