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

目录
  • SpringMVC默认处理的几种异常
  • @ResponseStatus
  • 异常处理的顺序
  • 自定义异常类(SpringMVC的异常处理)
    • ①:自定义异常类
    • ②:自定义异常处理器
    • ③:配置我们的异常处理器

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

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

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

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

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

  • AnnotationMethodHandlerExceptionResolver:通过注解@ExceptionHandler实现异常理出
  • ResponseStatusExceptionResolver:通过注解@ResponseStatus处理HTTP请求的状态码异常
  • DefaultHandlerExceptionResolver:处理Spring Exception并将其转换为HTTP响应状态码传送的客户端

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只能实现简单的提示
 *当程序中抛出HttpStateCode404Exception会使用提示语:页面未找到
 */
@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 {
    /*@ExceptionHandler({Throwable.class})
    public String handleThisController(){
        return "/handleException/404";
    }*/
    @RequestMapping("{url}")
    public void handle404(){
        throw new HttpStateCode404Exception();
    }
}

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

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

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

再来看看@ExceptionHandler

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

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

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

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

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

具体实现

/**
 * 定义一个处理所有Controllers的ExceptionHandler
 */
@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>

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

(0)

相关推荐

  • Spring MVC中异常处理的三种方式

    前言 在 SpringMVC, SpringBoot 处理 web 请求时, 若遇到错误或者异常,返回给用户一个良好的错误信息比 Whitelabel Error Page 好的多. SpringMVC 提供了三种异常处理方式, 良好的运用它们可以给用户提供可读的错误信息. 1. 实现 HandlerExceptionResolver public class AppHandlerExceptionResolver implements HandlerExceptionResolver { @O

  • 详解使用Spring MVC统一异常处理实战

    1 描述 在J2EE项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的.不可预知的异常需要处理.每个过程都单独处理异常,系统的代码耦合度高,工作量大且不好统一,维护的工作量也很大. 那么,能不能将所有类型的异常处理从各处理过程解耦出来,这样既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护?答案是肯定的.下面将介绍使用Spring MVC统一处理异常的解决和实现过程. 2 分析 Spring MVC处理异常有3种方

  • Springmvc自定义异常处理器实现流程解析

    当dispatchServlet接收到controller抛出的异常时,会将异常交由 HandlerExceptionResolver 异常处理器处理!我们可以创建自定义异常处理器实现该接口来处理自定义异常 1) 自定义异常类 public class MyException extends Exception { // 异常信息 private String message; public MyException() { super(); } public MyException(String

  • Spring MVC异常处理机制示例详解

    前言 在Spring MVC中,当一个请求发生异常(Controller抛出一个异常时), DispatcherServlet 采用委托的方式交给一个处理链来处理或者解析这个抛出的异常,这是在request和Servlet Container之间的一道屏障,所以我们可以在这里做一些处理工作,如转换异常,转换成友好的error page或者http 状态码等. 核心接口 这个处理机制在Spring是以HandlerExceptionResolver接口为核心的,该接口只有一个处理方法: Model

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

    目录 SpringMVC默认处理的几种异常 @ResponseStatus 异常处理的顺序 自定义异常类(SpringMVC的异常处理) ①:自定义异常类 ②:自定义异常处理器 ③:配置我们的异常处理器 本节介绍SpringMVC的异常处理机制 首先介绍SpringMVC默认提供了一些HTTP错误类似码的默认异常处理 如何给一个Controller自定义异常处理 如何为项目做一个全局异常处理 提到异常处理,就不得不提HandlerExceptionResolvers,我们的DispatcherS

  • SpringBoot错误处理机制以及自定义异常处理详解

    上篇文章我们讲解了使用Hibernate Validation来校验数据,当校验完数据后,如果发生错误我们需要给客户返回一个错误信息,因此这节我们来讲解一下SpringBoot默认的错误处理机制以及如何自定义异常来处理请求错误. 一.SpringBoot默认的错误处理机制 我们在发送一个请求的时候,如果发生404 SpringBoot会怎么处理呢?我们来发送一个不存在的请求来验证一下看看页面结果.如下所示: 当服务器内部发生错误的时候,页面会返回什么呢? @GetMapping("/user/{

  • 剖析Java中的事件处理与异常处理机制

    一.事件处理 其实,由事件处理这个名字自然就想到MFC中的消息响应机制,就我的体会,它们应该算是南桔北枳的情形吧,我怀疑Java中的事件处理这个"新瓶"应是装的MFC中的消息响应这个"旧酒".     所谓的"事件"即如键盘按键.鼠标点击等这类由动作或什么导致某个状态改变并需要对这个改变作相应响应的这类改变.我们可以将Java中的事件分为按钮.鼠标.键盘.窗口.其它事件这几大类.     事件处理模型  1.   基于继承的事件处理模型(JDK1

  • Java SpringMVC拦截器与异常处理机制详解分析

    目录 拦截器(interceptor)的作用 拦截器快速入门 案例:用户登录权限控制 拦截器方法说明 SpringMVC异常处理 异常处理的思路 异常处理两种方式 拦截器(interceptor)的作用 Spring MVC的拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理. 将拦截器按一定的顺序联结成一条链,这条链称为拦截器链(Interceptor Chain).在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用.拦截器也是AOP思

  • SpringMVC项目异常处理机制详解

    目录 1.异常分类 2.自定义项目业务异常 3.自定义项目系统异常 4.其他异常 5.异常代码 6.异常处理器 7.异常发生 1.异常分类 通常分为三类:系统异常(SystemException),业务异常(BusinessException)和其他异常(Exception) 业务异常指由于用户的不规范操作产生的异常,如不合法的参数传入 系统异常指项目运行过程中可预计但无法避免的异常,如数据库宕机 其他异常指开发者未曾预料到的异常 2.自定义项目业务异常 public class Busines

  • 详解SpringMVC中的异常处理机制

    目录 开头 1.ExceptionHandlerExceptionResolver 2. demo 开头 试想一下我们一般怎么统一处理异常呢,答:切面.但抛开切面不讲,如果对每一个controller方法抛出的异常做专门处理,那么着实太费劲了,有没有更好的方法呢?当然有,就是本篇文章接下来要介绍的springmvc的异常处理机制,用到了ControllerAdvice和ExceptionHandler注解,有点切面的感觉哈哈. 1.ExceptionHandlerExceptionResolve

  • Java 超详细讲解Spring MVC异常处理机制

    目录 异常处理机制流程图 异常处理的两种方式 简单异常处理器SimpleMappingExceptionResolver 自定义异常处理步骤 本章小结 异常处理机制流程图 系统中异常包括两类: 预期异常 通过捕获异常从而获取异常信息. 运行时异常RuntimeException 主要通过规范代码开发.测试等手段减少运行时异常的发生. 系统的Dao.Service.Controller出现都通过throws Exception向上抛出,最后SpringMVC前端控制器交由异常处理器进行异常处理,如

  • C++中的异常处理机制详解

    异常处理 增强错误恢复能力是提高代码健壮性的最有力的途径之一,C语言中采用的错误处理方法被认为是紧耦合的,函数的使用者必须在非常靠近函数调用的地方编写错误处理代码,这样会使得其变得笨拙和难以使用.C++中引入了异常处理机制,这是C++的主要特征之一,是考虑问题和处理错误的一种更好的方式.使用错误处理可以带来一些优点,如下: 错误处理代码的编写不再冗长乏味,并且不再和正常的代码混合在一起,程序员只需要编写希望产生的代码,然后在后面某个单独的区段里编写处理错误的嗲吗.多次调用同一个函数,则只需要某个

  • Jersey框架的统一异常处理机制分析

    一.背景 写这边文章源于有朋友问过java中的checked exception和unchecked exception有啥区别,当时我对其的回答是:我编程时仅用RuntimeException.其实,我说句话我是有前提的,确切的应该这么说:在成熟的开发框架下编写业务代码,我只使用或关注RuntimeException.因为,由于框架往往将异常的处理统一封装,这样以便程序员更好的关注业务代码,而业务的一些错误通常是在系统运行期间发生的,因此业务的异常通常被设计为RuntimeException的

  • 深入理解java异常处理机制及应用

    1. 引子 try-catch-finally恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解.不过,我亲自体验的"教训"告诉我,这个东西可不是想象中的那么简单.听话.不信?那你看看下面的代码,"猜猜"它执行后的结果会是什么?不要往后看答案.也不许执行代码看真正答案哦.如果你的答案是正确,那么这篇文章你就不用浪费时间看啦. package Test; public class TestException { public TestEx

随机推荐