SpringMVC異常處理器

本節內容:html

  • 異常處理思路
  • 自定義異常類
  • 自定義異常處理器
  • 異常處理器配置
  • 錯誤頁面
  • 異常測試

 

springmvc在處理請求過程當中出現異常信息交由異常處理器進行處理,自定義異常處理器能夠實現一個系統的異常處理邏輯。(它負責捕獲,將異常放到咱們本身編寫的處理類中)前端

 

1、異常處理器思路

系統中異常包括兩類:預期異常和運行時異常RuntimeException,前者經過捕獲異常從而獲取異常信息,後者主要經過規範代碼開發、測試經過手段減小運行時異常的發生。
java

系統的dao、service、controller出現都經過throws Exception向上拋出,最後由springmvc前端控制器交由異常處理器進行異常處理,以下圖:web

 

2、自定義異常類

爲了區別不一樣的異常,一般根據異常類型進行區分,這裏咱們建立一個自定義系統異常。
若是controller、service、dao拋出此類異常說明是系統預期處理的異常信息。spring

【示例】:MyException.javamvc

package com.wisedu.springmvc.exception;

public class MyException extends Exception{

	private String msg;

	public MyException() {
		super();
	}

	public MyException(String msg) {
		super();
		this.msg = msg;
	}

	public String getMsg() {
		return msg;
	}

	public void setMsg(String msg) {
		this.msg = msg;
	}
	
}

 

3、自定義異常處理器

CustomExceptionResolver.javaapp

package com.wisedu.springmvc.exception;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.Writer;

/**
 * 異常處理器的自定義的實現類
 * @author jkzhao
 *
 */
public class CustomHandleException implements HandlerExceptionResolver{

	public ModelAndView resolveException(HttpServletRequest request, 
			HttpServletResponse response, Object obj, // obj是發生異常的地方。好比異常發生在 Serivce層的某個方法,obj是 包名+類名+方法名(形參)拼起來的一個字符串
			Exception e) {

		//記錄日誌
		//...

		// 定義異常信息
		String msg;

		//判斷異常類型
		if(e instanceof MyException){
			//預期異常
			msg = ((MyException) e).getMsg();
		}else{
			// 若是是運行時異常,則取錯誤堆棧,從堆棧中獲取異常信息
			Writer out = new StringWriter();
			PrintWriter s = new PrintWriter(out);
			e.printStackTrace(s);
			msg = out.toString();
		}

        // 返回錯誤頁面,給用戶友好頁面顯示錯誤信息
        ModelAndView mav = new ModelAndView();
        mav.addObject("msg", msg);
		mav.setViewName("error");
		return mav;
	}

}

完整的寫法,包含了預期異常和運行時異常。jsp

 

4、異常處理器配置

在springmvc.xml中添加:測試

<!-- 異常處理器 -->
	<bean id="customHandleException"  class="com.wisedu.springmvc.exception.CustomHandleException"></bean>

 

5、錯誤頁面

error.jspui

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

	<h1>系統發生異常了!</h1>
	<br />
	<h1>異常信息</h1>
	<br />
	<h2>${msg }</h2>

</body>
</html>

 

6、異常測試

修改ItemController方法「itemList」,拋出異常:

        @RequestMapping(value = "/item/itemlist.action")
	public ModelAndView itemList() throws MyException {
		
		// 從MySQL中查詢數據
		List<Items> list = itemService.selectItemsList();

        //運行時異常
        int i = 1/0;

        //自定義異常
        if (true){
            throw new MyException("商品信息不能爲空");
        }

		// 建立ModelAndView,用來存放數據和視圖
		ModelAndView mav = new ModelAndView();
		// 設置數據到模型中
		mav.addObject("itemList", list); //頁面上循環的是itemList
		// 設置視圖的路徑,須要設置視圖的物理地址
		//mav.setViewName("/WEB-INF/jsp/itemList.jsp");
		mav.setViewName("itemList"); //在springmvc.xml中替換掉默認的視圖解析器

		return mav;
	}
相關文章
相關標籤/搜索