SpringMVC(11):異常處理器

本文主要介紹springmvc中異常處理的思路,并展示如何自定義異常處理類以及全局異常處理器的配置

異常處理思路

系統(tǒng)中異常包括兩類:

  • 預(yù)期異常
  • 運(yùn)行時異常RuntimeException
    前者通過捕獲異常從而獲取異常信息门粪,后者主要通過規(guī)范代碼開發(fā)箩祥、測試通過手段減少運(yùn)行時異常的發(fā)生巷屿。

系統(tǒng)的dao、service治笨、controller出現(xiàn)都通過throws Exception向上拋出夕土,最后由springmvc前端控制器交由異常處理器進(jìn)行異常處理,如下圖:

springmvc提供全局異常處理器(一個系統(tǒng)只有一個異常處理器)進(jìn)行統(tǒng)一異常處理井誉。

自定義異常類

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

package com.iot.learnssm.firstssm.exception;

/**
 * Created by brian on 2016/3/7.
 *
 * 系統(tǒng) 自定義異常類颗圣,針對預(yù)期的異常,需要在程序中拋出此類的異常
 */
public class CustomException  extends  Exception{
    //異常信息
    public String message;

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

    public String getMessage() {
        return message;
    }

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

全局異常處理器

思路:
系統(tǒng)遇到異常屁使,在程序中手動拋出在岂,dao拋給service、service給controller蛮寂、controller拋給前端控制器蔽午,前端控制器調(diào)用全局異常處理器。

全局異常處理器處理思路:
解析出異常類型

  • 如果該異常類型是系統(tǒng)自定義的異常酬蹋,直接取出異常信息及老,在錯誤頁面展示
  • 如果該異常類型不是系統(tǒng)自定義的異常抽莱,構(gòu)造一個自定義的異常類型(信息為“未知錯誤”)
    springmvc提供一個HandlerExceptionResolver接口
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        //handler就是處理器適配器要執(zhí)行Handler對象(只有method)
        //解析出異常類型
        //如果該 異常類型是系統(tǒng) 自定義的異常,直接取出異常信息骄恶,在錯誤頁面展示
        //String message = null;
        //if(ex instanceof CustomException){
            //message = ((CustomException)ex).getMessage();
        //}else{
            ////如果該 異常類型不是系統(tǒng) 自定義的異常食铐,構(gòu)造一個自定義的異常類型(信息為“未知錯誤”)
            //message="未知錯誤";
        //}

        //上邊代碼變?yōu)?        CustomException customException;
        if(ex instanceof CustomException){
            customException = (CustomException)ex;
        }else{
            customException = new CustomException("未知錯誤");
        }
//錯誤信息
        String message = customException.getMessage();

        ModelAndView modelAndView = new ModelAndView();

        //將錯誤信息傳到頁面
        modelAndView.addObject("message", message);

        //指向錯誤頁面
        modelAndView.setViewName("error");

        return modelAndView;

    }
}

錯誤頁面

<%--
  Created by IntelliJ IDEA.
  User: Brian
  Date: 2016/3/4
  Time: 10:51
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>錯誤提示</title>
</head>
<body>
${message}
</body>
</html>

在springmvc.xml配置全局異常處理器

<!-- 全局異常處理器
只要實現(xiàn)HandlerExceptionResolver接口就是全局異常處理器
-->
<bean class="com.iot.learnssm.firstssm.exception.CustomExceptionResolver"></bean>

全局異常處理器只有一個,配置多個也沒用僧鲁。

異常測試

在controller虐呻、service、dao中任意一處需要手動拋出異常寞秃。如果是程序中手動拋出的異常斟叼,在錯誤頁面中顯示自定義的異常信息,如果不是手動拋出異常說明是一個運(yùn)行時異常春寿,在錯誤頁面只顯示“未知錯誤”朗涩。

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

public String editItems(Model model,@RequestParam(value="id",required=true) Integer items_id)throws Exception {

    //調(diào)用service根據(jù)商品id查詢商品信息
    ItemsCustom itemsCustom = itemsService.findItemsById(items_id);

    //判斷商品是否為空,根據(jù)id沒有查詢到商品堂淡,拋出異常馋缅,提示用戶商品信息不存在
    if(itemsCustom == null){
        throw new CustomException("修改的商品信息不存在!");
    }

    //通過形參中的model將model數(shù)據(jù)傳到頁面
    //相當(dāng)于modelAndView.addObject方法
    model.addAttribute("items", itemsCustom);

    return "items/editItems";
}

在service接口中拋出異常:

public ItemsCustom findItemsById(Integer id) throws Exception {
    Items items = itemsMapper.selectByPrimaryKey(id);
    if(items==null){
        throw new CustomException("修改的商品信息不存在!");
    }
    //中間對商品信息進(jìn)行業(yè)務(wù)處理
    //....
    //返回ItemsCustom
    ItemsCustom itemsCustom = null;
    //將items的屬性值拷貝到itemsCustom
    if(items!=null){
        itemsCustom = new ItemsCustom();
        BeanUtils.copyProperties(items, itemsCustom);
    }

    return itemsCustom;
}
  • 如果與業(yè)務(wù)功能相關(guān)的異常,建議在service中拋出異常绢淀。
  • 與業(yè)務(wù)功能沒有關(guān)系的異常萤悴,建議在controller中拋出。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末皆的,一起剝皮案震驚了整個濱河市覆履,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌费薄,老刑警劉巖硝全,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異楞抡,居然都是意外死亡伟众,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門召廷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凳厢,“玉大人,你說我怎么就攤上這事竞慢∠茸希” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵筹煮,是天一觀的道長遮精。 經(jīng)常有香客問我,道長败潦,這世上最難降的妖魔是什么本冲? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任准脂,我火速辦了婚禮,結(jié)果婚禮上眼俊,老公的妹妹穿的比我還像新娘意狠。我一直安慰自己,他們只是感情好疮胖,可當(dāng)我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布环戈。 她就那樣靜靜地躺著,像睡著了一般澎灸。 火紅的嫁衣襯著肌膚如雪院塞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天性昭,我揣著相機(jī)與錄音拦止,去河邊找鬼。 笑死糜颠,一個胖子當(dāng)著我的面吹牛汹族,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播其兴,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼顶瞒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了元旬?” 一聲冷哼從身側(cè)響起榴徐,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎匀归,沒想到半個月后坑资,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡穆端,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年袱贮,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片体啰。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡攒巍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出狡赐,到底是詐尸還是另有隱情,我是刑警寧澤钦幔,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布枕屉,位于F島的核電站,受9級特大地震影響鲤氢,放射性物質(zhì)發(fā)生泄漏搀擂。R本人自食惡果不足惜西潘,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望哨颂。 院中可真熱鬧喷市,春花似錦、人聲如沸威恼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽箫措。三九已至腹备,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間斤蔓,已是汗流浹背植酥。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留弦牡,地道東北人友驮。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像驾锰,于是被迫代替她去往敵國和親卸留。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容