0
点赞
收藏
分享

微信扫一扫

Java【全局异常】无法捕获【环绕通知】


📚目录

  • 问题:环绕通知异常无法抛出
  • 全局异常处理代码:
  • 日志环绕切面
  • 请求接口
  • 演示效果
  • 解决:
  • 效果

问题:环绕通知异常无法抛出

在系统中自定义了全局异常处理器,无法捕获异常源。

全局异常处理代码:

/**
 * 全局异常处理
 * @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掉所以代码正常运行了,并没有被我们的全局异常捕获到。

Java【全局异常】无法捕获【环绕通知】_开发语言

请求接口

请求接口中添加异常,并且在其中的接口中添加日志环绕注解Aop

Java【全局异常】无法捕获【环绕通知】_java_02

演示效果

请求cs1接口 由于try/catch 指打印了错误信息,后置通知也正常走完。

Java【全局异常】无法捕获【环绕通知】_java_03

客户端响应:没有返回值

Java【全局异常】无法捕获【环绕通知】_java_04

请求cs2接口 客户端响应正常捕获到了错误代码行数

Java【全局异常】无法捕获【环绕通知】_异常处理_05

解决:

       在环绕通知里面不要使用try/catch而是直接抛出错误,这样全局异常就可以正常捕获到,但是还是会有问题,比如说抛出后,后置通知和最终通知就不能生效了。

Java【全局异常】无法捕获【环绕通知】_java_06

效果

客户端响应结果:

Java【全局异常】无法捕获【环绕通知】_java_07


通过返回值可以快速知道错误的代码在那个位置上

Java【全局异常】无法捕获【环绕通知】_开发语言_08

控制台:

Java【全局异常】无法捕获【环绕通知】_客户端_09


举报

相关推荐

0 条评论