springmvc註解開發-高級之異常處理

1      異常處理

1.1      異常處理思路

 

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

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

1.2      自定義異常類

 

對不同的異常類型定義異常類,繼承Exception。

 爲了區別不同的異常通常根據異常類型自定義異常類,這裏我們創建一個自定義系統異常,如果controller、service、dao拋出此類異常說明是系統預期處理的異常信息。

 

         public class CustomException extends Exception {

 

    /** serialVersionUID*/

    private static final long serialVersionUID = -5212079010855161498L;

   

    public CustomException(String message){

       super(message);

       this.message = message;

    }

 

    //異常信息

    private String message;

 

    public String getMessage() {

       return message;

    }

 

    public void setMessage(String message) {

       this.message = message;

    }

}

 

 

1.3自定義異常處理器

 

思路:

         系統遇到異常,在程序中手動拋出,dao拋給service、service給controller、controller拋給前端控制器,前端控制器調用全局異常處理器。

         全局異常處理器處理思路:

                  解析出異常類型

                  如果該 異常類型是系統 自定義的異常,直接取出異常信息,在錯誤頁面展示

                  如果該 異常類型不是系統 自定義的異常,構造一個自定義的異常類型(信息爲“未知錯誤”)

 

springmvc提供一個HandlerExceptionResolver接口

public class CustomExceptionResolver implementsHandlerExceptionResolver {

 

    @Override

    public ModelAndView resolveException(HttpServletRequestrequest,

           HttpServletResponse response, Object handler, Exceptionex) {

 

       ex.printStackTrace();

 

       CustomException customException = null;

      

       //如果拋出的是系統自定義異常則直接轉換

       if(ex instanceof CustomException){

           customException = (CustomException)ex;

       }else{

           //如果拋出的不是系統自定義異常則重新構造一個未知錯誤異常。

           customException = new CustomException("未知錯誤,請與系統管理員聯繫!");

       }

      

       ModelAndView modelAndView = new ModelAndView();

       modelAndView.addObject("message", customException.getMessage());

       modelAndView.setViewName("error");

 

       return modelAndView;

    }

 

}

 

1.4錯誤頁面

 

<%@ page language="java"contentType="text/html; charset=UTF-8"

   pageEncoding="UTF-8"%>

<%@ taglib uri="http://java.sun.com/jsp/jstl/core"prefix="c" %>

<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"  prefix="fmt"%>

<!DOCTYPE htmlPUBLIC "-//W3C//DTDHTML 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>錯誤頁面</title>

 

</head>

<body>

您的操作出現錯誤如下:<br/>

${message }

</body>

 

</html>


1.5 異常處理器配置

在springmvc.xml中添加:

 

<!-- 異常處理器 -->

    <bean id="handlerExceptionResolver"class="cn.itcast.ssm.controller.exceptionResolver.CustomExceptionResolver"/>

 

1.6    異常測試

 

在controller、service、dao中任意一處需要手動拋出異常。

如果是程序中手動拋出的異常,在錯誤頁面中顯示自定義的異常信息,如果不是手動拋出異常說明是一個運行時異常,在錯誤頁面只顯示“未知錯誤”。

 

在商品修改的controller方法中拋出異常 .

 

 

在service接口中拋出異常:

 

如果與業務功能相關的異常,建議在service中拋出異常。

與業務功能沒有關係的異常,建議在controller中拋出。

 

上邊的功能,建議在service中拋出異常。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章