天天看点

自定义异常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