自定义错误页面
- 当出现异常时,会根据错误状态码,跳转到相应的页面

- 例如出现一个404的错误,会首先去找error路径下有没有404错误页面,如果没有则去找有没有4xx的页面,如果也没有,则返回默认的错误信息
处理全局异常
- @ControllerAdvice+@ExceptionHandler,使用这两个注解处理控制层全局的异常,当控制层出现指定的异常时,执行相应的处理方案
| |
| |
| @Slf4j |
| @ControllerAdvice |
| public class GlobalExceptionHandler { |
| @ExceptionHandler({ArithmeticException.class,NullPointerException.class}) |
| public String handleArithException(Exception e){ |
| log.error("异常是:{}",e); |
| return "login"; |
| } |
| } |
| |
自定义异常
- 我们在编写业务时需抛出异常的时候,可抛出一个自定义的异常
| |
| @ResponseStatus(value= HttpStatus.FORBIDDEN,reason = "用户数量太多") |
| public class UserTooManyException extends RuntimeException { |
| |
| public UserTooManyException(){ |
| |
| } |
| public UserTooManyException(String message){ |
| super(message); |
| } |
| |
| } |
| |
| UNAUTHORIZED(401, HttpStatus.Series.CLIENT_ERROR, "Unauthorized"), |
| PAYMENT_REQUIRED(402, HttpStatus.Series.CLIENT_ERROR, "Payment Required"), |
| FORBIDDEN(403, HttpStatus.Series.CLIENT_ERROR, "Forbidden"), |
| NOT_FOUND(404, HttpStatus.Series.CLIENT_ERROR, "Not Found"), |
| METHOD_NOT_ALLOWED(405, HttpStatus.Series.CLIENT_ERROR, "Method Not Allowed"), |
| NOT_ACCEPTABLE(406, HttpStatus.Series.CLIENT_ERROR, "Not Acceptable"), |
| PROXY_AUTHENTICATION_REQUIRED(407, HttpStatus.Series.CLIENT_ERROR, "Proxy Authentication Required"), |
| REQUEST_TIMEOUT(408, HttpStatus.Series.CLIENT_ERROR, "Request Timeout"), |
| CONFLICT(409, HttpStatus.Series.CLIENT_ERROR, "Conflict"), |
| GONE(410, HttpStatus.Series.CLIENT_ERROR, "Gone"), |
| LENGTH_REQUIRED(411, HttpStatus.Series.CLIENT_ERROR, "Length Required"), |
| PRECONDITION_FAILED(412, HttpStatus.Series.CLIENT_ERROR, "Precondition Failed"), |
| PAYLOAD_TOO_LARGE(413, HttpStatus.Series.CLIENT_ERROR, "Payload Too Large"), |
| |
| |
自定义异常解析器
| |
| @Order(value= Ordered.HIGHEST_PRECEDENCE) |
| @Component |
| public class CustomerHandlerExceptionResolver implements HandlerExceptionResolver { |
| @Override |
| public ModelAndView resolveException(HttpServletRequest request, |
| HttpServletResponse response, |
| Object handler, Exception ex) { |
| |
| try { |
| response.sendError(511,"我喜欢的错误"); # 自定义错误状态码和错误msg |
| } catch (IOException e) { |
| e.printStackTrace(); |
| } |
| return new ModelAndView(); # 最后该解析器处理所有异常,并返回错误状态码和错误msg,在精准匹配后,跳转到对应错误页面 |
| } |
| } |
| |
| package org.springframework.core; |
| |
| public interface Ordered { |
| int HIGHEST_PRECEDENCE = -2147483648; |
| int LOWEST_PRECEDENCE = 2147483647; |
| |
| int getOrder(); |
| } |
| |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY