Spring框架中异常处理优先级:为什么SQL异常被Exception捕获?
在 Spring 框架中,异常处理方法的优先级遵循以下规则:更具体的异常类型处理方法优先级高于泛化的异常类型。
当发生异常时,Spring 会按照异常类的继承关系,从低到高的顺序查找匹配的异常处理方法。这意味着,如果在 ProjectExceptionAdvice 类中,@ExceptionHandler(Exception.class) 方法位于其他更具体的异常处理方法之前,那么其他更具体的异常处理方法将被 Exception 类型所捕获。
例如,在以下代码中,@ExceptionHandler(SQLException.class) 方法应该放在 @ExceptionHandler(Exception.class) 方法之前:
@RestControllerAdvice
public class ProjectExceptionAdvice {
@ExceptionHandler(SQLException.class)
public Result handlerSQLException(SQLException ex) {
ex.printStackTrace();
return new Result(Code.ERROR, '录入数据格式错误,请确认后重试');
}
@ExceptionHandler(ClassNotFoundException.class)
public Result handlerClassNotFoundException(ClassNotFoundException ex) {
ex.printStackTrace();
return new Result(Code.ERROR, '类未找到');
}
@ExceptionHandler(NullPointerException.class)
public Result handlerNullPointerException(NullPointerException ex) {
ex.printStackTrace();
return new Result(Code.ERROR, '空指针异常');
}
@ExceptionHandler(ArrayIndexOutOfBoundsException.class)
public Result handlerArrayIndexOutOfBoundsException(ArrayIndexOutOfBoundsException ex) {
ex.printStackTrace();
return new Result(Code.ERROR, '数组越界异常');
}
@ExceptionHandler(FileNotFoundException.class)
public Result handlerFileNotFoundException(FileNotFoundException ex) {
ex.printStackTrace();
return new Result(Code.ERROR, '找不到文件');
}
@ExceptionHandler(Exception.class)
public Result handlerException(Exception ex) {
ex.printStackTrace();
return new Result(Code.ERROR, '未知服务器错误,请联系管理员');
}
}
通过将 @ExceptionHandler(Exception.class) 方法放在最后,其他更具体的异常处理方法会优先匹配,当发生 SQL 异常时,会被 handlerSQLException 方法所捕获,而不会被 handlerException 方法捕获。
希望以上解释和修改后的代码能够解决您的问题。如果您有任何疑问,请随时追问。
原文地址: https://www.cveoy.top/t/topic/b8cs 著作权归作者所有。请勿转载和采集!