2023年11月29日发(作者:)

若依(V4.3.1)异常处理

1. 分析

异常处理对于系统的稳定性⾮常重要,如果系统出现了unchecked exception那么会直接导致系统崩溃,但是,没有项⽬经验的我们,在处理问

题的时候应该如何来处理这些异常呢?我想若依项⽬肯定能给⼤家带来⼀些思路上的启发。

2. GlobalExceptionHandler

该类所在的⽬录为:ruoyi-frameworksrcmainjavacomruoyiframeworkwebexception

framework表⽰的就是框架层⾯的代码,这⾥其实使⽤的异常处理⽅式就是使⽤了SpringMVC中全局异常处理机制。

@RestControllerAdvice

public class GlobalExceptionHandler

{

private static final Logger log = ger();

/**

* 权限校验失败 如果请求为ajax返回json,普通请求跳转页⾯

*/

@ExceptionHandler()

public Object handleAuthorizationException(HttpServletRequest request, AuthorizationException e)

{

(sage(), e);

if (Request(request))

/**

* 业务异常

*/

@ExceptionHandler()

public Object businessException(HttpServletRequest request, BusinessException e)

{

(sage(), e);

if (Request(request))

{

return (sage());

}

else

HttpMediaTypeNotAcceptableException406 - Not Acceptable

Spring异常HTTP状态码

HttpMediaTypeNotSupportedException415 - Unsupported Media Type

HttpMessageNotReadableException400 - Bad Request

HttpMessageNotWritableException500 - Internal Server Error

HttpRequestMethodNotSupportedException405 - Method Not Allowed

MethodArgumentNotValidException400 - Bad Request

MissingServletRequestParameterException400 - Bad Request

MissingServletRequestPartException400 - Bad Request

NoSuchRequestHandlingMethodException404 - Not Found

TypeMismatchException400 - Bad Request

@Controller

@RequestMapping("/simple")

public class SimpleController {

@RequestMapping("/demo2")

@ResponseBody

@ResponseStatus(code = )

public String demo2(){

return "hello world";

总结⼀下

1. 不管哪种⽅式,@ReponseStatus最后都是通过tus或ror来处理

2. 如果只是为了返回状态码,建议只使⽤ @ResponseStatus(code=xxxx)这样来设置响应状态码;

3. 如果抛出异常呢,不建议@ControllerAdvice⾥⾯的 @ResponseStatus和 ⾃定义异常上的 @ResponseStatus⼀起使⽤,两个⼀起使⽤

肯定是⼀个⽣效,⽽且是 @ControllerAdvice中的@ResponseStatus⽣效

3.3 使⽤try-catch的⽅式捕获异常

使⽤try-catch是java中处理异常的⽅式,这种⽅式是最容易想到的⽅式,但是由于这种⽅式⾮常难维护,我们还是⽤其他⽅式处理

3.4 使⽤@ExceptionHandler处理⾃定义异常

@Controller

够处理所有控制器中处理器⽅法所抛出的异常呢?

Spring3.2已经帮我们完成了这样⼀个设想。在Spring 3.2之后,为这类问题引⼊了⼀个新的解决⽅案:控制器通知。

控制器通知(controller advice)是指任意带有@ControllerAdvice注解的类。

这个类会包含⼀个或多个如下类型的⽅法:

1. @ExceptionHandler注解标注的⽅法;

2. @InitBinder注解标注的⽅法;

3. @ModelAttribute注解标注的⽅法。

在带有@ControllerAdvice注解的类中,上述的这些⽅法会运⽤到整个应⽤程序所有控制器中带有@RequestMapping注解的⽅法上。