springMVC学习(9)-全局异常处理

一、异常处理思路:

系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。

系统的dao、service、controller出现都通过throws Exception向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理,如下图:

springmvc提供全局异常处理器(一个系统只有一个异常处理器)进行统一异常处理。

二、自定义异常类 继承Exception

 1 package com.cy.exception;
 2
 3 /**
 4  * 系统 自定义异常类,针对预期的异常,需要在程序中抛出此类的异常
 5  * @author chengyu
 6  *
 7  */
 8 public class CustomException extends Exception{
 9
10     public String message;
11
12     public CustomException(String message){
13         super(message);
14         this.message = message;
15     }
16
17     public String getMessage() {
18         return message;
19     }
20
21     public void setMessage(String message) {
22         this.message = message;
23     }
24 }

CustomException

三、全局异常处理器:

思路:

系统遇到异常,在程序中手动抛出,dao抛给service、service给controller、controller抛给前端控制器,前端控制器调用全局异常处理器。

全局异常处理器处理思路:

解析出异常类型

如果该 异常类型是系统 自定义的异常,直接取出异常信息,在错误页面展示

如果该 异常类型不是系统 自定义的异常,构造一个自定义的异常类型(信息为“未知错误”)

 1 package com.cy.exception;
 2
 3 import javax.servlet.http.HttpServletRequest;
 4 import javax.servlet.http.HttpServletResponse;
 5
 6 import org.springframework.web.servlet.HandlerExceptionResolver;
 7 import org.springframework.web.servlet.ModelAndView;
 8
 9 /**
10  * 全局异常处理器
11  * @author chengyu
12  *
13  */
14 public class CustomExceptionResolver implements HandlerExceptionResolver{
15
16     /**
17      * ex 系统 抛出的异常
18      * handler就是处理器适配器要执行Handler对象(只有method)
19      */
20     @Override
21     public ModelAndView resolveException(HttpServletRequest request,
22             HttpServletResponse response, Object handler, Exception ex) {
23
24         CustomException customException = null;
25
26         //解析出异常类型
27         //如果该 异常类型是系统 自定义的异常,直接取出异常信息,在错误页面展示
28         //如果该 异常类型不是系统 自定义的异常,构造一个自定义的异常类型(信息为“未知错误”)
29         if(ex instanceof CustomException){
30             customException = (CustomException) ex;
31         }else{
32             customException = new CustomException("未知错误!");
33         }
34
35         ModelAndView modelAndView = new ModelAndView();
36         modelAndView.addObject("message", customException.getMessage());
37         modelAndView.setViewName("error");
38         return modelAndView;
39     }
40
41 }

四、错误页面:

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 7 <title>错误提示</title>
 8 </head>
 9 <body>
10 ${message }
11 </body>
12 </html>

在springmvc.xml中配置全局异常处理器:

1 <!-- 全局异常处理器 只要实现HandlerExceptionResolver接口就是全局异常处理器 -->
2 <bean class="com.cy.exception.CustomExceptionResolver" /> 

五、测试代码:

在controller、service、dao中任意一处手动抛出异常;手动抛出的异常,在错误页面显示自定义的错误异常信息;

如果不是手动抛出的异常,说明是一个RunTimeException;在错误页面只显示“未知错误”;

1)在Controller中抛出异常:

 1 @RequestMapping(value="/editItems",method={RequestMethod.POST,RequestMethod.GET})
 2     public String editItems(Model model,@RequestParam(value="id",required=true,defaultValue="4") Integer items_id) throws Exception{
 3         ItemsCustom itemsCustom = itemsService.findItemsById(items_id);
 4
 5         if(itemsCustom == null){
 6             throw new CustomException("商品信息不存在!");
 7         }
 8
 9         model.addAttribute("items", itemsCustom);
10
11         return "items/editItems";
12     }

2)在service中抛出异常:

 1 @Override
 2     public ItemsCustom findItemsById(Integer id) throws Exception {
 3         Items items = itemsMapper.selectByPrimaryKey(id);
 4
 5         if(items == null){
 6             throw new CustomException("该商品信息不存在啊!");
 7         }
 8
 9         ItemsCustom itemsCoustom = null;
10         if(items!=null){
11             itemsCoustom = new ItemsCustom();
12             BeanUtils.copyProperties(items, itemsCoustom);
13         }
14
15         return itemsCoustom;
16     }

程序运行到抛出异常会跳出该方法的,不再执行;

如果与业务功能相关的异常,建议在service中抛出异常。

与业务功能没有关系的异常,建议在controller中抛出。

上边的功能,建议在service中抛出异常。

时间: 2024-11-05 11:10:19

springMVC学习(9)-全局异常处理的相关文章

SpringMVC 学习笔记(十) 异常处理HandlerExceptionResolver

Spring MVC 通过 HandlerExceptionResolver 处理程序的异常,包括 Handler 映射.数据绑定以及目标方法执行时发生的异常. SpringMVC 提供的 HandlerExceptionResolver 的实现类 DispatcherServlet 默认装配的 HandlerExceptionResolver : 如果添加了<mvc:annotation-driven/> 则装配变为: 1.1. ExceptionHandlerExceptionResolv

SpringMVC 全局异常处理

在 JavaEE 项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的.不可预知的异常需要处理.每个过程都单独处理异常,系统的代码耦合度高,工作量大且不好统一,维护的工作量也很大.SpringMvc 对于异常处理这块提供了支持,通过 SpringMvc 提供的全局异常处理机制,能够将所有类型的异常处从各处理过程解耦出来,这样既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护. 全局异常实现方式 Spring MVC

SpringMVC实现全局异常处理

在springMVC中进行全局异常处理的配置 <bean class="cn.znx.blog.exception.MyExceptionResolver"></bean> 定义全局异常处理类:需要实现HandlerExceptionResolver接口 package cn.znx.blog.exception; import com.google.gson.Gson; import org.springframework.web.bind.annotatio

springMVC学习笔记汇总(持续更新)

SpringMVC 学习笔记(一) Hello World SpringMVC 学习笔记(二) @RequestMapping.@PathVariable等注解 SpringMVC 学习笔记(三) 使用ServletAPI 和 实体 做为参数 SpringMVC 学习笔记(四) 处理模型数据 SpringMVC 学习笔记(五) 基于RESTful的CRUD SpringMVC 学习笔记(六) 数据绑定和JSR校验 SpringMVC 学习笔记(七) JSON返回:HttpMessageConve

springMVC3学习(八)--全局的异常处理

在springMVC的配置文件中: <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="defaultErrorView"> <value>/error</value><!-- 表示当抛出异常但没有

SpringMVC学习系列(10) 之 异常处理

在项目中如何处理出现的异常,在每个可能出现异常的地方都写代码捕捉异常?这显然是不合理的,当项目越来越大是也是不可维护的.那么如何保证我们处理异常的代码精简且便于维护呢?这就是本篇要讲的内容->异常处理. 在Spring MVC中我们可以通过以下2中途径来对异常进行集中处理: 一.继承HandlerExceptionResolver接口实现自己的处理方法,如: public class MyHandlerExceptionResolver implements HandlerExceptionRe

springmvc学习笔记--REST API的异常处理

前言: 最近使用springmvc写了不少rest api, 觉得真是一个好框架. 之前描述的几篇关于rest api的文章, 其实还是不够完善. 比如当遇到参数缺失, 类型不匹配的情况时, 直接抛出异常, 返回的内容是500+的错误页面, 而不是json内容, 这让移动端的调用方很难处理. 本文主要讲述对于rest api, springmvc对异常的解决处理方案. 系列整理: springmvc学习笔记系列的文章目录: • idea创建springmvc项目 • 面向移动端的REST API

全局异常处理springmvc

一.实现HandlerExceptionResolver接口 /** * springmvc 全局异常处理 */ @Slf4j public class GlobalExceptionResolver implements HandlerExceptionResolver{ @Override public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpSe

SpringMVC的全局异常处理

@ControllerAdvice的使用 我们都知道做项目一般都会有全局异常统一处理的类,那么这个类在Spring中可以用@ControllerAdvice来实现. @ControllerAdvice ,这是一个非常有用的注解,顾名思义,这是一个增强的 Controller.使用这个 Controller ,可以实现三个方面的功能: 全局异常处理 全局数据绑定 全局数据预处理 灵活使用这三个功能,可以帮助我们简化很多工作,需要注意的是,这是 SpringMVC 提供的功能,在 Spring Bo