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