文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

SpringMVC 异常处理机制与自定义异常处理方式

2024-04-02 19:55

关注

本节介绍SpringMVC的异常处理机制

首先介绍SpringMVC默认提供了一些HTTP错误类似码的默认异常处理

如何给一个Controller自定义异常处理

如何为项目做一个全局异常处理

提到异常处理,就不得不提HandlerExceptionResolvers,我们的DispatcherServlet默认设置三个异常处理器:

SpringMVC默认处理的几种异常

Exception HTTP Status Code

BindException

400 (Bad Request)

ConversionNotSupportedException

500 (Internal Server Error)

HttpMediaTypeNotAcceptableException

406 (Not Acceptable)

HttpMediaTypeNotSupportedException

415 (Unsupported Media Type)

HttpMessageNotReadableException

400 (Bad Request)

HttpMessageNotWritableException

500 (Internal Server Error)

HttpRequestMethodNotSupportedException

405 (Method Not Allowed)

MethodArgumentNotValidException

400 (Bad Request)

MissingServletRequestParameterException

400 (Bad Request)

MissingServletRequestPartException

400 (Bad Request)

NoHandlerFoundException

404 (Not Found)

NoSuchRequestHandlingMethodException

404 (Not Found)

TypeMismatchException

400 (Bad Request)

MissingPathVariableException

500 (Internal Server Error)

NoHandlerFoundException

404 (Not Found)

首先介绍的是注解@ResponseStatus

@ResponseStatus

用于自定义异常类上

该异常属于某种HTTP错误状态码异常(或者说交由其处理)

例如:我们自定义一个异常类:HttpStateCode404Exception,将其映射到404状态码

异常类:HttpStateCode404Exception.java



@ResponseStatus(code=HttpStatus.NOT_FOUND,reason="页面未找到")
public class HttpStateCode404Exception extends RuntimeException{
    private static final long serialVersionUID = 1L;
}

然后我们在一个Controller类处理/handleException/存在在的映射路径时的处理方法


@Controller
@RequestMapping("handleException")
public class HandleExceptionController {
    
    @RequestMapping("{url}")
    public void handle404(){
        throw new HttpStateCode404Exception();
    }
}

细心的读者,一定会发现,我在上面注掉的代码使用了@ExceptionHandler注解

最终我们可以得到错误页面提示是这样的:好丑,但是有我们的reason

这里写图片描述

此方式只能实现简单的信息提示。

再来看看@ExceptionHandler

打开上面被注释掉的代码,你会发现我们的错误控制可以(转发)跳转页面了。

而且由于我们的这个方法定义在这个Controller类中,只要满足此@ExceptionHandler定义的异常都会走这个方法。

注意:是这个Controller类中所有请求出现异常,且异常被其包含

我希望定义一个全局异常处理呢???@ControllerAdvice

为我们实现处理所以的控制器Controllers的异常

具体实现



@ControllerAdvice
public class GlobalExceptionAdvice {
    @ExceptionHandler({HttpStateCode404Exception.class})
    public String handleThisController(){
        return "/handleException/404";
    }
    
}

异常处理的顺序

1.Controller处理时抛出异常

2.本Controller类中的@ExceptionHandler如果捕获到,就执行其处理方法

3.否则,由全局异常捕获处理

4.否则,由@ResponseStatus注解的异常捕获处理

5.最后DefaultHandlerExceptionResolver处理

这恰恰也就是DispatcherServlet异常处理器的配置顺序(循序调用,List)

自定义异常类(SpringMVC的异常处理)

SpringMVC当中的异常处理–自定义异常处理类

①:自定义异常类


public class CustomerException extends Exception {
    //定义我们的异常信息
    private String exceptMsg;
    public CustomerException(String exceptMsg){
        this.exceptMsg = exceptMsg;
    }
    public String getExceptMsg() {
        return exceptMsg;
    }
    public void setExceptMsg(String exceptMsg) {
        this.exceptMsg = exceptMsg;
    }
}

②:自定义异常处理器


import java.io.PrintWriter;
import java.io.StringWriter;
import javax.jws.WebParam.Mode;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.omg.CORBA.PRIVATE_MEMBER;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
public class CustomerExceptionResolver implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,Exception ex) {
        //通过我们自定义异常处理器,继承自HandlerExceptionResolver  来实现我们的异常处理
        //自定义我们的异常信息
        String  msg = "";
        //通过ModelAndView 来实现跳转到我们的错误页面,并且将错误信息带回到页面进行显示
        ModelAndView view = new ModelAndView();
        view.setViewName("error");
        //取出我们自定义的异常信息
        if(ex instanceof CustomerException){
            CustomerException exception = (CustomerException) ex;
            msg = exception.getExceptMsg();
        }else{
            //获取我们的stringWriter来获取我们的异常信息
            StringWriter writer = new StringWriter();
            PrintWriter printWriter = new PrintWriter(writer);
            //通过ex.printStackTrace(printWriter);来向我们的printWriter当中输入异常信息
            ex.printStackTrace(printWriter);
            msg = writer.toString();
        }
        //获取到异常信息之后,通过短信,邮件等技术,通知相关人员
        view.addObject("msg", msg);
        return view;
    }
}

③:配置我们的异常处理器


<!-- 申明我们的异常解析处理类-->
<bean id="customerExceptionResolver" class="cn.itcast.springmvc.exception.CustomerExceptionResolver"></bean>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯