SpringBoot中的常用异常处理

异常处理

目前暂时只列举

  • ExceptionHandler:控制器的异常处理
  • ResponseStatus 异常设置异常状态处理
  • AbstractErrorController:继承抽象异常控制器处理全局异常

ExceptionHandler使用

@RestControllerAdvice
public class ExceptionController {

    @ExceptionHandler(ArithmeticException.class)
    public String handlerException(Exception e) {
        e.printStackTrace();
        return "Integer类型转换异常";
    }

    @ExceptionHandler(NullPointerException.class)
    @ResponseStatus(value = HttpStatus.FORBIDDEN)
    public String nullException(Exception e) {
        return "空指针异常";
    }
}

注意事项ExceptionHandler是处理控制器中的异常的,包括拦截器中的异常

ResponseStatus使用

ResponseStatus是设置响应状态和信息的

可以注解在

  • 响应方法上,比如RequestMapping方法和RestControllerAdvice类上或者方法上
  • 异常类上
@ResponseStatus(value = HttpStatus.FORBIDDEN, reason = "用户名密码不匹配")
public class NoMatchException extends RuntimeException {
}
    @ExceptionHandler(NullPointerException.class)
    @ResponseStatus(value = HttpStatus.FORBIDDEN)
    public String nullException(Exception e) {
        return "空指针异常";
    }

AbstractErrorController全局异常处理

ContollerAdvice只能拦截控制器中的异常,换言之,只能拦截500之类的异常,但是对于404这样不会进入控制器处理的异常不起作用。

/**
 * Error controller.
 *
 * @author xiao7
 */
@RestController
@ConditionalOnWebApplication
@RequestMapping("${server.error.path:${error.path:/error}}")
public class ErrorController extends AbstractErrorController {

    private static final String SPECIAL_ERROR_FLAG = "org.springframework.boot.web.servlet.error.DefaultErrorAttributes.ERROR";

    @Value("${error.path:/error}")
    private String errorPath;

    /**
     * Instantiates a new Error controller.
     *
     * @param errorAttributes the error attributes
     */
    public ErrorController(ErrorAttributes errorAttributes) {
        super(errorAttributes);
    }


    /**
     * Error object.
     *
     * @param request the request
     * @return the object
     */
    @RequestMapping
    @ResponseBody
    public Object error(HttpServletRequest request) {
        Object specialError = request.getAttribute(SPECIAL_ERROR_FLAG);

        if (specialError instanceof NoMatchException) {
            System.out.println("自定义的密码不匹配异常");
            return "自定义的密码不匹配异常";
        }
        Map<String, Object> error = getErrorAttributes(request, true);
        int httpCode = (int) error.getOrDefault("status", -1);
        String message = error.getOrDefault("message", "").toString();
        String exMsg = (String) error.getOrDefault("error", "");
        Map<String, Object> result = new HashMap<>();
        result.put("code", httpCode);
        result.put("msg", message);
        return result;
    }

    /**
     * Method validation post processor method validation post processor.
     *
     * @return the method validation post processor
     */
    @Bean
    public MethodValidationPostProcessor methodValidationPostProcessor() {
        return new MethodValidationPostProcessor();
    }

    @Override
    public String getErrorPath() {
        return errorPath;
    }

}

至于运行结果,请自行运行~~~~

注意事项:在实际使用中往往需要多种异常处理互相搭配只用才能达到预期的效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值