在Spring Boot中实现全局异常处理可以通过以下方式:
- 使用
@ControllerAdvice
注释创建一个全局异常处理类,并使用@ExceptionHandler
注释来定义具体异常的处理方法。
import your.package.IllegalNumberException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;/*** @class GlobalExceptionHeadler* @date 2021/8/28 13:41*/
@ControllerAdvice
public class GlobalExceptionHeadler {//处理指定异常@ExceptionHandler(value = IllegalNumberException.class)//IllegalNumberException 自定义异常@ResponseBodypublic ResponseEntity<String> illegalNumberExceptionHeadler(Exception e){System.out.println("进入非法参数异常处理");return new ResponseEntity<>(e.getMessage(),HttpStatus.INTERNAL_SERVER_ERROR);}//处理exceptioin子类异常@ExceptionHandler(value = Exception.class)//作用方法上,作用:用来处理指定异常; value属性:用来处理指定类型的异常@ResponseBodypublic ResponseEntity<String> exceptionHeadler(Exception e){//if(e instanceof IllegalNumberException){} 等价于 上面的方法处理指定异常System.out.println("进入自定义异常处理");return new ResponseEntity<>(e.getMessage(),HttpStatus.INTERNAL_SERVER_ERROR);}
}
- 自定义异常
/*** @class IllegalNumberException* @date 2021/8/28 14:05*/
public class IllegalNumberException extends RuntimeException{public IllegalNumberException(String message){super(message);}
}
- Controller
import your.package.IllegalNumberException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;@RestController
@Slf4j
public class Test2Controller {@GetMapping("/testException")public ResponseEntity<String> demo(){int i = 1/0;return new ResponseEntity<>("ok", HttpStatus.OK);}@GetMapping("/testIllegalNumberException/{id}")public ResponseEntity<String> demo(@PathVariable("id") Integer id){if(id < 0){throw new IllegalNumberException("无效id,请检查");}return new ResponseEntity<>("ok", HttpStatus.OK);}}
- Postman测试效果
通用异常:
自定义异常:
5. 总结
在以上代码片段中,使用了 @ExceptionHandler
注解来指定该方法会处理哪种类型的异常。方法体中,你可以自定义返回给用户的响应,包括HTTP状态码和返回信息。使用 @ControllerAdvice
注解可以确保它会接收到由控制器抛出的异常。
如果需要更多具体的自定义设置,还可以在响应里添加 headers 信息,或者创建更复杂的响应体,例如使用ResponseEntity
。官方的 Spring 框架文档提供了和这个主题相关的更多高级选项和最佳实践指南。