SpringMVC统一异常处理实例代码

一、需求

  • 一般项目中都需要作异常处理,基于系统架构的设计考虑,使用统一的异常处理方法。
  • 系统中异常类型有哪些?
  • 包括预期可能发生的异常、运行时异常(RuntimeException),运行时异常不是预期会发生的。
  • 针对预期可能发生的异常,在代码手动处理异常可以try/catch捕获,可以向上抛出。
  • 针对运行时异常,只能通过规范代码质量、在系统测试时详细测试等排除运行时异常。

二、统一异常处理解决方案

2.1 定义异常

针对预期可能发生的异常,定义很多异常类型,这些异常类型通常继承于Exception。

这里定义一个系统自定义异常类:

CustomException,用于测试。

public class CustomException extends Exception {

  //异常信息
  private String message;

  public CustomException(String message){
    super(message);
    this.message = message;

  }
  public String getMessage() {
    return message;
  }

  public void setMessage(String message) {
    this.message = message;
  }

}

2.2 异常处理

要在一个统一异常处理的类中要处理系统抛出的所有异常,根据异常类型来处理。

统一异常处理的类是什么?

前端控制器DispatcherServlet在进行HandlerMapping、调用HandlerAdapter执行Handler过程中,如果遇到异常,进行异常处理。

在系统中自定义统一的异常处理器,写系统自己的异常处理代码。

统一异常处理器实现HandlerExceptionResolver接口。

public class CustomExceptionResolver implements HandlerExceptionResolver {

  //前端控制器DispatcherServlet在进行HandlerMapping、调用HandlerAdapter执行Handler过程中,如果遇到异常就会执行此方法
  //handler最终要执行的Handler,它的真实身份是HandlerMethod
  //Exception ex就是接收到异常信息
  @Override
  public ModelAndView resolveException(HttpServletRequest request,
      HttpServletResponse response, Object handler, Exception ex) {
    //输出异常
    ex.printStackTrace();

    //统一异常处理代码
    //针对系统自定义的CustomException异常,就可以直接从异常类中获取异常信息,将异常处理在错误页面展示
    //异常信息
    String message = null;
    CustomException customException = null;
    //如果ex是系统 自定义的异常,直接取出异常信息
    if(ex instanceof CustomException){
      customException = (CustomException)ex;
    }else{
      //针对非CustomException异常,对这类重新构造成一个CustomException,异常信息为“未知错误”
      customException = new CustomException("未知错误");
    }

    //错误 信息
    message = customException.getMessage();

    request.setAttribute("message", message);

    try {
      //转向到错误 页面
      request.getRequestDispatcher("/WEB-INF/jsp/error.jsp").forward(request, response);
    } catch (ServletException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }

    return new ModelAndView();
  }

}

2.3 配置统一异常处理器

<!-- 定义统一异常处理器 -->
  <bean class="com.hao.ssm.exception.CustomExceptionResolver"></bean>

2.4 异常处理逻辑

  • 根据不同的异常类型进行异常处理。
  • 系统自定义的异常类是CustomException ,在controller方法中、service方法中手动抛出此类异常。
  • 针对系统自定义的CustomException异常,就可以直接从异常类中获取异常信息,将异常处理在错误页面展示。
  • 针对非CustomException异常,对这类重新构造成一个CustomException,异常信息为“未知错误”,此类错误需要在系统测试阶段去排除。
  • 在统一异常处理器CustomExceptionResolver中实现上边的逻辑。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Spring MVC Controller返回值及异常的统一处理方法

    旧的设计方案 开发api的时候,需要先定义好接口的数据响应结果.如下是一个很简单直接的Controller实现方法及响应结果定义. @RestController @RequestMapping("/users") public class UserController { @Inject private UserService userService; @GetRequest("/{userId:\\d+}") public ResponseBean signin

  • 基于SpringMVC的全局异常处理器介绍

    近几天又温习了一下SpringMVC的运行机制以及原理 我理解的springmvc,是设计模式MVC中C层,也就是Controller(控制)层,常用的注解有@Controller.@RequestMapping.@Autowared.@Component,今天呢,我所要写的是SpringMVC的全局异常处理器,关联的接口有HandlerExceptionResolver(Eclipse用户可以按Ctrl+Shift+T进行搜索该接口),什么是全局异常处理器?为什么要用它呢? 在企业开发中,各种

  • springmvc如何进行异常处理

    异常处理 局部处理(直接写在处理器中) @ExceptionHandler public ModelAndView error(Exception exception) { ModelAndView mv = new ModelAndView(); mv.addObject("error", exception.getMessage()); mv.setViewName("forward:../error.jsp"); return mv; } 全局处理(新建一个类

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

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

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

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

  • Spring MVC全局异常处理和单元测试_动力节点Java学院整理

    在spring MVC的配置文件中: <!-- 总错误处理--> <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="defaultErrorView"> <value>/error/error</

  • 详解Spring MVC/Boot 统一异常处理最佳实践

    前言 在 Web 开发中, 我们经常会需要处理各种异常, 这是一件棘手的事情, 对于很多人来说, 可能对异常处理有以下几个问题: 什么时候需要捕获(try-catch)异常, 什么时候需要抛出(throws)异常到上层. 在 dao 层捕获还是在 service 捕获, 还是在 controller 层捕获. 抛出异常后要怎么处理. 怎么返回给页面错误信息. 异常处理反例 既然谈到异常, 我们先来说一下异常处理的反例, 也是很多人容易犯的错误, 这里我们同时讲到前端处理和后端处理 : 捕获异常后

  • SpringMVC异常处理知识点总结

    ResultCode CommonCode UserCode CustomException ExceptionCatch <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.9.RELEASE</version> <relativeP

  • SpringMVC统一异常处理实例代码

    一.需求 一般项目中都需要作异常处理,基于系统架构的设计考虑,使用统一的异常处理方法. 系统中异常类型有哪些? 包括预期可能发生的异常.运行时异常(RuntimeException),运行时异常不是预期会发生的. 针对预期可能发生的异常,在代码手动处理异常可以try/catch捕获,可以向上抛出. 针对运行时异常,只能通过规范代码质量.在系统测试时详细测试等排除运行时异常. 二.统一异常处理解决方案 2.1 定义异常 针对预期可能发生的异常,定义很多异常类型,这些异常类型通常继承于Excepti

  • SpringMVC整合mybatis实例代码

    MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis . 一.逆向工程生成基础信息 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis G

  • Python 中的Selenium异常处理实例代码

    自动化测试执行过程中,难免会有错误/异常出现,比如测试脚本没有发现对应元素,则会立刻抛出NoSuchElementException异常.这时不要怕,肯定是测试脚本或者测试环境哪里出错了!那如何处理才是关键?因为一般只是局部有问题,为了让脚本继续执行,so我们可以用try...except...raise捕获异常.该捕获异常后可以打印出相应的异常原因,这样以便于分析异常原因. 下面将举例说明,当异常抛出后将信息打印在控制台,同时截取当前浏览器窗口,作为后续bug的依据给相应开发人员更好下定位问题

  • SpringMVC统一异常处理三种方法详解

    这篇文章主要介绍了SpringMVC-统一异常处理三种方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在 Spring MVC 应用的开发中,不管是对底层数据库操作,还是业务层或控制层操作,都会不可避免地遇到各种可预知的.不可预知的异常需要处理. 如果每个过程都单独处理异常,那么系统的代码耦合度高,工作量大且不好统一,以后维护的工作量也很大. 如果能将所有类型的异常处理从各层中解耦出来,这样既保证了相关处理过程的功能单一,又实现了异常信

  • springboot断言异常封装与统一异常处理实现代码

    目录 步骤 1.异常类 2.统一异常处理配置类 3.断言类 4.使用 补充:异常处理器说明 handleServletException handleBindException handleValidException handleBusinessException.handleBaseException handleException 总结 步骤 1.异常类 package com.walker.dianping.common.exceptions; import lombok.Data; @

  • SpringMVC mybatis整合实例代码详解

    MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis . 一.逆向工程生成基础信息 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis G

  • SpringMvc导出Excel实例代码

    前言 相信很多朋友在实际工作中都会要将数据导出成Excel的需求,通常这样的做法有两种. 一是采用JXL来生成Excel,之后保存到服务器,然后在生成页面之后下载该文件. 二是使用POI来生成Excel,之后使用Stream的方式输出到前台直接下载(ps:当然也可以生成到服务器中再下载.).这里我们讨论第二种. Struts2的方式 通常我会将已经生成好的HSSFWorkbook放到一个InputStream中,然后再到xml配置文件中将返回结果更改为stream的方式.如下: private

  • 利用golang实现封装trycatch异常处理实例代码

    前言 社区不少人在谈论 golang 为毛不用trycatch模式,而采用苛刻的recovery.panic.defer组合-.    从网上整了一个trycatch包,感觉不错,拿出来分享下-下面话不多说,来一起看看详细的介绍. 示例代码 package main import ( "reflect" ) type TryCatch struct { errChan chan interface{} catches map[reflect.Type]func(err error) d

  • SpringMVC集成Swagger实例代码

    此前写过一个关于SpringBoot集成Swagger的帖子,因为有的项目是SpringMVC的,所以也简单整理了一下,基本一致. 本例使用的是spring 4.1.6版本 1.添加POM依赖 <!-- Jackson --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <vers

  • flask中主动抛出异常及统一异常处理代码示例

    本文主要介绍的是flask中主动抛出异常及统一异常处理的相关内容,具体如下. 在开发时,后台出现异常 ,但不想把异常显示给用户或者要统一处理异常时,可以使用abort主动抛出异常,再捕获异常返回美化后的页面. 主动抛出异常: @user.route('/testError') def testError(): print ('testError') abort(404) 使用装饰器errorhandler捕获异常: @user.errorhandler(404) def error(e): re

随机推荐