天天看點

自定義異常MyException

自定義異常類

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