SpringBoot-06的全局异常捕捉

本文介绍了一种全局异常处理的方法,通过定义一个GlobalExceptionHandler类并使用@ControllerAdvice注解,实现对所有异常的统一处理。该方法适用于Spring MVC项目,并提供了一个具体的示例代码。

步骤:

 ① 新建一个GlobalExceptionHandler, 使用@ControllerAdvice修饰;
 ② 创建一个方法, 使用@ExceptionHandler(value=Exception.class)修饰, 对异常进行拦截;
 ③ 在方法中判断:
  • 若返回的是视图View, 则返回ModelAndView或者视图名
  • 若返回String或者JSON, 则在方法上添加@ResponseBody注解;

具体代码:

package online.bendou.exception;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(value=Exception.class)
    @ResponseBody
    public String exceptionHandler(){
        /**
         * 若返回的是视图view(模板引擎还没有学):
         * 则代码如下:
         *  ModelAndView modelAndView = new ModelAndView();
         *  modelAndView.setViewName("error");
         * return modeAndView;
         */
        return "服务器繁忙,请稍后重试!";
    }

}
### 实现 Spring Boot 多模块项目的全局异常处理 在构建复杂的多模块应用程序时,确保一致性和可维护性的全局异常处理机制至关重要。通过定义统一的错误响应结构和集中化的异常处理器,可以提高系统的健壮性和用户体验。 #### 使用 `@ControllerAdvice` 注解创建全局异常处理器类 为了捕获整个应用中的未处理异常并提供友好的反馈给客户端,推荐使用带有 `@ControllerAdvice` 的控制器增强器来实现全局异常管理功能[^1]: ```java import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; @ControllerAdvice(basePackages = {"com.example.moduleA", "com.example.moduleB"}) public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public ResponseEntity<ErrorResponse> handleException(Exception ex) { ErrorResponse errorResponse = new ErrorResponse( HttpStatus.INTERNAL_SERVER_ERROR.value(), "Unexpected server error", System.currentTimeMillis() ); return new ResponseEntity<>(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR); } } ``` 此方法允许开发者指定哪些包下的异常会被该顾问所拦截,并返回标准化的 JSON 错误消息体。 #### 定义自定义异常及其对应的 HTTP 响应状态码映射表 对于业务逻辑层面可能出现的具体场景,建议封装成特定类型的运行期异常,并为其分配合适的HTTP状态码以便于前端解析: ```java // Custom exceptions with status codes mapping public class ResourceNotFoundException extends RuntimeException { private final int statusCode; public ResourceNotFoundException(String message, int statusCode){ super(message); this.statusCode = statusCode; } // Getter for statusCode... } // Update the global handler accordingly @ExceptionHandler(ResourceNotFoundException.class) protected ResponseEntity<Object> handleResourceNotFound(RuntimeException ex) { ApiError apiError = new ApiError(((ResourceNotFoundException)ex).getStatusCode(), ex.getMessage()); return buildResponseEntity(apiError); } ``` 这样做的好处是可以更精确地传达问题所在以及指导下一步操作方向。 #### 配置跨多个子模块共享相同的异常处理策略 当项目被拆分为若干独立但又相互关联的小型服务单元时,可以通过引入公共依赖库的方式让各个部分都能继承同样的异常捕捉行为而无需重复编写相同代码片段。这不仅减少了冗余还增强了协作效率。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值