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

springboot实现全局异常处理及⾃定义异常类

⽬录

全局异常处理及⾃定义异常类

全局异常处理

定义⼀个业务异常的枚举

全局异常处理配置

springbootRestful使⽤

springboot返回ModelAndView

全局异常处理及⾃定义异常类

全局异常处理

定义⼀个处理类,使⽤@ControllerAdvice注解。

@ControllerAdvice注解:控制器增强,⼀个被@Component注册的组件。

配合@ExceptionHandler来增强所有的@requestMapping⽅法。

例如:@ExceptionHandler() ⽤来捕获@requestMapping的⽅法中所有抛出的exception

代码:

@ControllerAdvice

public class GlobalDefultExceptionHandler {

//声明要捕获的异常

@ExceptionHandler()

@ResponseBody

public String defultExcepitonHandler(HttpServletRequest request,Exception e) {

return “error”;

}

}

这样,全局异常处理类完毕。可以添加⾃⼰的逻辑。

然后还有⼀个问题,有的时候,我们需要业务逻辑时抛出⾃定义异常,这个时候需要⾃定义业务异常类。

定义classBusinessException ,使他继承于RuntimeException.

说明:因为某些业务需要进⾏业务回滚。但spring的事务只针对RuntimeException的进⾏回滚操作。所以需要回滚就要继承

RuntimeException

public class BusinessException extends RuntimeException{

}

然后,现在来稍微完善⼀下这个类。

当我们抛出⼀个业务异常,⼀般需要错误码和错误信息。有助于我们来定位问题。

所以如下:

public class BusinessException extends RuntimeException{

//⾃定义错误码

private Integer code;

}

这时候,我们发现还有⼀个问题,如果这样写,在代码多起来以后,很难管理这些业务异常和错误码之间的匹配。所以在优化

⼀下。

把错误码及错误信息,组装起来统⼀管理。

定义⼀个业务异常的枚举

public enum ResultEnum {

UNKONW_ERROR(-1,"未知错误"),

SUCCESS(0,"成功"),

ERROR(1,"失败"),

;

private Integer code;

private String msg;

ResultEnum(Integer code,String msg) {

= code;

= msg;

}

springboot Restful使⽤

@ControllerAdvice@ExceptionHandler@ResponseBody实现全局异常处理

@ControllerAdvice

注解定义全局异常处理类

@ExceptionHandler

指定⾃定义错误处理⽅法拦截的异常类型

同⼀个异常被⼩范围的异常类和⼤范围的异常处理器同时覆盖,会选择⼩范围的异常处理器

1.定义异常业务类

/**

* 异常VO

*

* @date 2017217

* @since 1.0.0

*/

public class ExceptionVO {

private String errorCode;

private String message;

public String getMessage() {

return message;

}

public SystemException(Object errorCode, String message, Throwable cause) {

super(message, cause);

ode = errorCode;

}

public SystemException(Object errorCode, String message) {

super(message);

ode = errorCode;

}

public SystemException(Object errorCode, String message, Object[] args, Throwable cause) {

super(message, cause);

= args;

ode = errorCode;

}

public SystemException(Object errorCode, String message, Object[] args) {

return vo;

}

@ExceptionHandler()

@ResponseStatus(CT)