全局异常处理,@SneakyThrows注解

全局异常处理器

Spring的异常处理器,只需要在类上加上@RestControllerAdvice是一个组合注解,是由@ControllerAdvice和@ResponseBody的组合。第一个注解用于定义@ExceptionHandler、@InitBinder和@ModelAttribute方法,这些方法对所有@RequestMapping方法都有效,第二个注解用于指示方法的返回值应该直接写入HTTP响应体,通常用于创建RESTful Web服务。

接下来是例子(学习的开源项目):

@RestControllerAdvice
public class GlobalExceptionHandler {

    /**
     * 拦截参数验证异常
     */
    @SneakyThrows
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public Result validExceptionHandler(HttpServletRequest request, MethodArgumentNotValidException ex) {
        BindingResult bindingResult = ex.getBindingResult();
        FieldError firstFieldError = CollectionUtil.getFirst(bindingResult.getFieldErrors());
        String exceptionStr = Optional.ofNullable(firstFieldError)
                .map(FieldError::getDefaultMessage)
                .orElse(StrUtil.EMPTY);
        log.error("[{}] {} [ex] {}", request.getMethod(), getUrl(request), exceptionStr);
        return Results.failure(BaseErrorCode.CLIENT_ERROR.code(), exceptionStr);
    }
}

在学习时,每个方法关注的是入参,返回值和返回值类型。MethodArgumentNotValidException是Spring Web自带的参数验证的类,返回的Results是自定义的结果返回类型。

此外处理逻辑还有个FieldError,它是 Spring 框架中的一个类,用于表示数据验证过程中出现的字段错误。

Optional类是java8引入的新容器,它可以保存一个值,也可以不保存任何值(即为空)。ofNullable方法是java8的新特性,它用于创建一个可能为空的Optional对象。具体过程,它接受一个可能为空的值作为参数,然后根据参数是否为空,返回一个Optional对象。如果参数为空,则返回一个空的Optional对象;如果参数不为空,则将参数包装成一个Optional对象并返回。

Optional的主要目的是为了避免NullPointerException,并不能代替null值,对于确定不会为空的值,还是应该直接使用null

处理器总结:

在类上加上@RestControllerAdvice就能拦截异常,方法上在加上@ExceptionHandler负责异常处理的逻辑就能处理全局异常了。

@SneakyThrows注解

今天学习Spring全局异常处理器,发现一个lombok的@SneakyThrows注解,用于简化异常处理。通常用于简化方法中的异常处理,使得代码更加简洁和易于阅读。

@SneakyThrows会自动将异常转换为RuntimeException,从而避免手动编写try-catch语句。 

下面是一个使用@SneakyThrows的示例:

readFile方法使用了@SneakyThrows注解,因此不需要在方法签名中添加throws IOException。当readFile方法抛出IOException时,它会自动转换为RuntimeException,从而避免手动编写try-catch语句。

@SneakyThrows虽然简化了异常处理,但是在复杂场景中。由于覆盖了异常不能准确知道是RuntimeException的子类异常还是本身,出问题不方便定位,使用需要慎重。

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果不想使用@ControllerAdvice注解,我们也可以通过实现HandlerExceptionResolver接口来实现全局异常处理。具体步骤如下: 1. 创建一个类,实现HandlerExceptionResolver接口。 2. 在类中实现resolveException方法,该方法会在全局异常发生时被执行。 3. 在resolveException方法中,我们可以根据不同的异常类型进行不同的处理,比如返回自定义错误信息或者跳转到指定页面。 4. 最后,我们需要将该类注册到Spring框架中,可以通过在配置文件中进行配置或者使用注解的方式进行注册。 以下是一个简单的示例: ```java public class GlobalExceptionHandler implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { // 返回自定义错误信息 ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("errorMsg", "系统错误,请稍后重试!"); modelAndView.setViewName("error"); return modelAndView; } } ``` 在上述代码中,我们实现了HandlerExceptionResolver接口并重写了resolveException方法。在该方法中,我们将错误信息存入ModelAndView中,并将viewName设置为"error",表示跳转到error页面显示错误信息。 最后,我们需要将该类注册到Spring框架中。可以通过在配置文件中进行配置或者使用注解的方式进行注册。例如,在Spring配置文件中添加如下配置: ```xml <bean id="globalExceptionHandler" class="com.example.GlobalExceptionHandler"/> ``` 在上述配置中,我们将GlobalExceptionHandler类注册为Spring的一个bean,并使用该类处理全局异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值