controller层统一处理异常,想搞清楚ZooKeepe

本文探讨了如何在Java后端使用@RestControllerAdvice和@ControllerAdvice进行统一异常处理,以提高代码的可读性和问题定位效率。通过举例说明了如何处理不同类型的异常,包括未处理的异常、自定义异常和参数异常,并展示了如何自定义异常以便更好地拦截和处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 1.异常参数:声明为一般异常或更具体的异常。若要声明更为具体得参数,可用value来确定

  • 2.请求和/或响应对象(通常来自Servlet API),可以选择任何特定的请求/响应类型:如 javax.servlet.http.HttpServletRequest

  • 3.会话对象:通常是javax.servlet.http.HttpSession,这种类型的参数将强制出现相应的会话,参数不能为空,

  • 4.当前请求区域设置的java.util.Locale

  • 5.java.io.InputStream / java.io.Reader访问请求的内容

(参考翻译来自源码的文档)

目前只用过第一种,用来处理异常。 回顾之前java异常处理 主要有这几个关键字:try catch finally throw throws 如果要抛出具体明确的异常,则可以用 try catch来捕捉,若有些异常不做处理 直接抛出,则可以使用 throw(主要是在语句抛出),throws(主要是在方法上抛出);试想以前的代码,有时一段代码,业务逻辑如果复杂,一个try就有多个catch,代码看起来就给人一种很冗余的感觉;使用@RestControllerAdvice @ExceptionHandler统一拦截异常处理 争对不同的异常抛出,我可以做不同的异常拦截,对拦截的异常信息做统一处理(统一数据格式)再返回前端,即使发生错误,错误信息的可读性也好,也能更快锁定问题。

插曲:

@RestControllerAdvice 和 @ControllerAdvice有何区别? 如下是@RestControllerAdvice注解的源码,可以看出@RestControllerAdvice包含了 @ControllerAdvice+@ResponseBody两个注解,若要使用@ControllerAdvice结合@ExceptionHandler作为异常统一拦截(返回json数据格式),则需要再加一个注解@ResponseBody

image.png

2.举例

  • 2.1 统一异常处理

@RestControllerAdvice

@Slf4j

@Order(Ordered.HIGHEST_PRECEDENCE)

public class OverallExceptionHandler {



    @ExceptionHandler

    public CommonResult handException(Exception e){

        return CommonResult.errorResult(ResultCode.SYSTEM_ERROR,e.getMessage());

    }



    @ExceptionHandler(value = UserException.class)

    public CommonResult handUserExceptionHandler(UserException e){

        return CommonResult.customErrorResult(null,e.getMessage(),null);

    }

    ```

  /**

  * 参数不可读

   */

   @ExceptionHandler(value = HttpMessageNotReadableException.class)

    public CommonResult handleHttpMessageNotReadableException(HttpMessageNotReadableException e) {

     return CommonResult.errorResult(ResultCode.PARAM_IS_INVALID, e.getMessage());

}



}

复制代码

handException方法主要拦截:没有被拦截处理的异常信息

handUserExceptionHandler:拦截主动抛出的异常信息(这个异常是自己自定义的异常信息)

handleHttpMessageNotReadableException:拦截参数不可读异常 这个异常时jdk里面自带的异常(正如上面所说 对于不同的异常 可以做不同的拦截处理,返回的错误信息也可以自己自定义 这样的错误提示能更快定位问题)

  • 2.2 自定义异常

public class UserException extends RuntimeException{

    private static final long serialVersionUID = 1L;

    private String code;



    public UserException() {

        super();

    }



    public UserException(String message) {

        super(message);

        this.code = ResultCode.EXISTING_ASSOCIATED_DATA.getCode();

    }



    public UserException(String code, String message){

        super(message);

        this.code = code;

    }



    public UserException(String message, Throwable cause) {

        super(message, cause);

    }



    public UserException(Throwable cause) {

        super(cause);

    }

}

复制代码

自定义异常 有些异常java中可能没包含的异常 自己也可以自定义 这些异常也可用拦截器进行拦截处理 只需要@ExceptionHandler(value = UserException.class)这样就可以拦截到自定义的异常

  • 2.3 controller层写的一个测试方法



# 最后

本人也收藏了一份Java面试核心知识点来应付面试,借着这次机会可以免费送给我的读者朋友们:

**目录:**

![二面蚂蚁金服(交叉面),已拿offer,Java岗定级阿里P6](https://img-blog.csdnimg.cn/img_convert/a74c5b32d3a9f60e5a4789fd1365d2a7.png)

Java面试核心知识点

**一共有30个专题,足够读者朋友们应付面试啦,也节省朋友们去到处搜刮资料自己整理的时间!**

![二面蚂蚁金服(交叉面),已拿offer,Java岗定级阿里P6](https://img-blog.csdnimg.cn/img_convert/8cdb85567f056190c8077280f8e35ab9.png)

Java面试核心知识点

,借着这次机会可以免费送给我的读者朋友们:

**目录:**

[外链图片转存中...(img-WXKeIB0p-1630814751877)]

Java面试核心知识点

**一共有30个专题,足够读者朋友们应付面试啦,也节省朋友们去到处搜刮资料自己整理的时间!**

[外链图片转存中...(img-CXBeWDjv-1630814751878)]

Java面试核心知识点

**[CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】](https://codechina.youkuaiyun.com/m0_60958482/java-p7)**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值