springboot整合全局捕获异常

Spring全局异常处理机制
本文介绍Spring框架中全局异常处理的实现方式,包括使用@ControllerAdvice注解创建异常处理类,利用AOP技术实现异常捕获,并探讨了异常处理类放置位置的影响。

一、全局捕获异常一般是捕获controller中的异常

二、创建捕获异常类:


三、全局捕获异常采用AOP技术,系统采用异常通知 的形式

四、@ControllerAdvice :是controller的一个辅助类,最常用的就是全局捕获异常处理的切切面类;

                                       可以指定扫包范围;

                                        约定了一种可行的返回值,如果返回值是model的话,需要@ResponseBody进行json转换;

                                        返回String 跳到某个view页面

                                        返回ModelAndView

                                        返回model+@ResponseBody     

        @ExcetionHandler(Exception.class):指定捕获的异常类型

        @ResponseBody  :异常处理方法返回json格式;非json格式时,方法客户返回ModelAndView页面


五、我有一个疑问就是:全局捕获异常类不放在跟controller同级下的话就捕获不到异常,请明白的小伙伴给解释一下吧。


        



### SpringBoot集成SpringMVC实现异常统一处理的最佳实践 为了在SpringBoot应用中实现异常的统一处理,可以采用`@ControllerAdvice`和`@ExceptionHandler`注解来捕获并处理不同类型的异常。以下是最佳实践的具体说明: #### 配置404异常抛出 为了让未匹配到任何处理器的情况也能触发异常机制,需在项目的`application.properties`或`application.yml`文件中添加以下配置[^1]: ```properties spring.mvc.throw-exception-if-no-handler-found=true spring.resources.add-mappings=false ``` 此设置使得当请求路径无法找到对应的控制器方法时,会抛出`NoHandlerFoundException`。 #### 使用@ControllerAdvice定义全局异常处理器 通过创建一个带有`@ControllerAdvice`注解的类,能够使该类中的方法成为整个应用程序范围内的异常处理器。下面是一个简单的例子[^2]: ```java import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.http.ResponseEntity; import org.springframework.web.servlet.NoHandlerFoundException; @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(value = NoHandlerFoundException.class) public ResponseEntity<String> handleNotFoundException(NoHandlerFoundException ex) { return new ResponseEntity<>("Resource not found", HttpStatus.NOT_FOUND); } @ExceptionHandler(value = Exception.class) public ResponseEntity<String> handleGeneralException(Exception ex) { return new ResponseEntity<>("An error occurred: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); } } ``` 这段代码展示了两个通用的方法:一个是专门用来捕捉资源找不到(即HTTP状态码404)的情形;另一个则是针对其他所有未知错误的一般性处理逻辑。 #### 自定义异常及其封装响应结构体 对于更复杂的业务场景,推荐构建自己的异常体系以便更好地管理和表达特定领域下的问题。这里给出一个自定义异常的例子以及相应的JSON格式化工具函数[^4]: ```java // 定义枚举表示不同的错误码与消息 public enum ResponseStatus { SUCCESS("0000", "Success"), PARAMETER_INVALID("1001", "Parameter invalid"); private final String ec; private final String em; ResponseStatus(String ec, String em){ this.ec = ec; this.em = em; } public String getEc(){ return ec; } public String getEm(){ return em; } } // 创建自定义运行时异常继承RuntimeException @Getter public class CustomBusinessException extends RuntimeException{ private final ResponseStatus status; public CustomBusinessException(ResponseStatus status){ super(status.getEc()+":"+status.getEm()); this.status=status; } } // 修改之前的GlobalExceptionHandler支持新的CustomBusinessException类型 @ExceptionHandler(CustomBusinessException .class) @ResponseBody public Map<String,Object> customHandle(CustomBusinessException e){ HashMap<String , Object> result=new HashMap<>(); result.put("code",e.getStatus().getEc()); result.put("msg",e.getStatus().getEm()); return result; } ``` 以上实现了从基本框架调整至高级定制化的全过程展示。不仅限于简单文字反馈,还可以依据实际需求扩展更多属性比如时间戳、追踪ID等附加信息。 #### JSON格式返回样例 考虑到现代Web服务大多倾向于RESTful风格API开发,最终呈现给用户的应答最好是以标准化JSON对象形式展现出来。例如上面提到的`customHandle()`方法就构造了一个包含`code`和`message`字段的标准回复包[^5]。 --- ###
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值