本節內容:html
springmvc在處理請求過程當中出現異常信息交由異常處理器進行處理,自定義異常處理器能夠實現一個系統的異常處理邏輯。(它負責捕獲,將異常放到咱們本身編寫的處理類中)前端
系統中異常包括兩類:預期異常和運行時異常RuntimeException,前者經過捕獲異常從而獲取異常信息,後者主要經過規範代碼開發、測試經過手段減小運行時異常的發生。
java
系統的dao、service、controller出現都經過throws Exception向上拋出,最後由springmvc前端控制器交由異常處理器進行異常處理,以下圖:web
爲了區別不一樣的異常,一般根據異常類型進行區分,這裏咱們建立一個自定義系統異常。
若是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; } }
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
在springmvc.xml中添加:測試
<!-- 異常處理器 --> <bean id="customHandleException" class="com.wisedu.springmvc.exception.CustomHandleException"></bean>
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>
修改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; }