最近在看性能优化相关的东西,就看到了关于自定义业务异常的使用,观点是不建议,如果一定要使用,在不需要知道异常堆栈信息的情况下必须重写Throwable的fillInStackTrace()方法,
这个方法是native修饰即JVM本地同步方法,native实现是将线程的栈帧信息记录到此 Throwable 对象中,也就是我们看到的发生在哪个类的哪一行代码处等信息。
其实开发中很多时候为了省事都直接在Service层直接抛业务异常,controller捕获业务异常封装结果,至少有时候我是这么写的。这种情况建议重写fillInStackTrace方法,直接返回this即当前业务异常实例对象,只是这样一来异常对象就没有堆栈信息了,一般我们的业务异常都是手动抛出来的所以也不需要知道堆栈信息。
public class ServiceException extends RuntimeException {
private static final long serialVersionUID = -2437160791033393978L;
public ServiceException(String msg) {
super(msg);
}
public ServiceException(Exception e){
this(e.getMessage());
}
/重写此方法,直接返回,避免调用本地方法爬堆栈信息提高性能
@Override
public synchronized Throwable fillInStackTrace() {
return this;
}
}
下面做了一个重写和不重写 fillInStackTrace()方法