在系统中自定义了全局异常处理器,无法捕获异常源。
/*** 全局异常处理* @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而是直接抛出错误,这样全局异常就可以正常捕获到,但是还是会有问题,比如说抛出后,后置通知和最终通知就不能生效了。
客户端响应结果:
通过返回值可以快速知道错误的代码在那个位置上
控制台:
下一篇:BI对企业到底有什么作用?