自定義異常類
public class MyException extends RuntimeException {
static final long serialVersionUID = 7818375828146090155L;
public MyException() {
}
public MyException(String message) {
super(message); // 把參數傳遞給Throwable的帶String參數的構造方法
}
public MyException(String message, Throwable cause) {
super(message, cause);
}
public MyException(Throwable cause) {
super(cause);
}
}
構造方法加入Throwable cause 原因:
在一些大型的,子產品化的軟體開發中,一旦一個地方發生異常,則如骨牌效應一樣,将導緻一連串的異常。假設B子產品完成自己的邏輯需要調用A子產品的方法,如果A子產品發生異常,則B也将不能完成而發生異常,但是B在抛出異常時,會将A的異常資訊掩蓋掉,這将使得異常的根源資訊丢失。異常的鍊化可以将多個子產品的異常串聯起來,使得異常資訊不會丢失。
異常鍊化:以一個異常對象為參數構造新的異常對象。新的異對象将包含先前異常的資訊。這項技術主要是異常類的一個帶Throwable參數的函數來實作的。這個當做參數的異常,我們叫他根源異常(cause)。
方法調用,觸發異常
@Test
public void testMyException() {
try {
checkSource(101);
} catch (MyException e) {
System.out.println("e: " + e);
System.out.println("e.getMessage: " + e.getMessage());
System.out.println("=====================");
throw new MyException("參數不可行", e);
}
}
private void checkSource(Integer source) {
if (source > 100 || source < 0) {
throw new MyException("參數不合法");
} else {
System.out.println("參數ok");
}
}
列印結果
e: com.pan.demo.exception.MyException: 參數不合法
e.getMessage: 參數不合法
=====================
com.pan.demo.exception.MyException: 參數不可行
at com.pan.demo.test1.testMyException(test1.java:88)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
...
Caused by: com.pan.demo.exception.MyException: 參數不合法
at com.pan.demo.test1.checkSource(test1.java:74)
at com.pan.demo.test1.testMyException(test1.java:83)
... 65 more