📚目录
- 问题:环绕通知异常无法抛出
- 全局异常处理代码:
- 日志环绕切面
- 请求接口
- 演示效果
- 解决:
- 效果
问题:环绕通知异常无法抛出
在系统中自定义了全局异常处理器,无法捕获异常源。
全局异常处理代码:
/**
* 全局异常处理
* @Author Itmei
* @Date 2023/3/22 21:46
* @Version 1.0
*/
@RestControllerAdvice
public class GlobalExceptionAdvice {
/**
* 运行时异常
* @param e
* @return
*/
@ExceptionHandler(RuntimeException.class)
public ResultData handlerRuntimeException(RuntimeException e){
return ResultData.error(classErrorRow(e));
}
/**
* 最大的捕获,当前面的捕获处理不了那么就会被该方法捕获
* @param e
* @return
*/
@ExceptionHandler(Throwable.class)
public ResultData handlerException(Exception e){
return ResultData.error(classErrorRow(e));
}
/**
* 返回类报错的行
* @param e
* @return
*/
public String classErrorRow(Throwable e) {
StackTraceElement[] stackTrace = e.getStackTrace();
String classErrorRow = stackTrace[0].toString();
String packageNmae = "com.itmei";
for (int i = 0; i < stackTrace.length; i++) {
StackTraceElement stackTraceElement = stackTrace[i];
if (stackTraceElement.toString().contains(packageNmae)) {
classErrorRow = stackTraceElement.toString();
break;
}
}
return classErrorRow;
}
}
日志环绕切面
展示日志环绕的切面,其实看到这里也应该知道,try里面的报错的代码会catch掉所以代码正常运行了,并没有被我们的全局异常捕获到。
请求接口
请求接口中添加异常,并且在其中的接口中添加日志环绕注解Aop
演示效果
请求cs1
接口 由于try/catch 指打印了错误信息,后置通知也正常走完。
客户端响应:没有返回值
请求cs2
接口 客户端响应:正常捕获到了错误代码行数
解决:
在环绕通知里面不要使用try/catch而是直接抛出错误,这样全局异常就可以正常捕获到,但是还是会有问题,比如说抛出后,后置通知和最终通知就不能生效了。
效果
客户端响应结果:
通过返回值可以快速知道错误的代码在那个位置上
控制台: