SSM框架整合筆記(五)統(tǒng)一異常處理

前言

?? 在Java項(xiàng)目中祖屏,在控制器、業(yè)務(wù)層效斑、數(shù)據(jù)庫(kù)操作的過(guò)程中非春,總是會(huì)遇到各種可控和不可控的異常需要處理,如果我們?cè)诿恳粋€(gè)異郴和溃可能出現(xiàn)的地方都手動(dòng)使用try{}catch{}單獨(dú)處理異常的話奇昙,會(huì)產(chǎn)生的最大的問(wèn)題就是:異常處理過(guò)程中的返回錯(cuò)誤信息、日志打印都可能不統(tǒng)一敌完,導(dǎo)致代碼冗余和不可維護(hù)敬矩。因此我們使用統(tǒng)一的方式處理異常:

本文內(nèi)容

一、SpringMVC處理異常方式:

  1. 使用@ExceptionHandler注解:弊端:進(jìn)行異常處理的方法必須與出錯(cuò)的方法在同一個(gè)Controller里面蠢挡;
  2. 實(shí)現(xiàn)HandlerExceptionResolver接口:可以進(jìn)行全局的異郴≡溃控制。
  3. 使用@ControllerAdvice注解:使用了該注解之后业踏,需要進(jìn)行異常處理的方法與出錯(cuò)的方法就不必須在同一個(gè)Controller中了禽炬。@ControllerAdvice + @ExceptionHandler也可以實(shí)現(xiàn)全局的異常捕捉。

二勤家、為控制器添加通知

如果要在多個(gè)控制器中處理異常腹尖,使用@ExceptionHandler注解是很有用的,但是如果多個(gè)控制器類(lèi)中都會(huì)拋出異常伐脖,那么所有的控制器中都有重復(fù)相同的@ExceptionHandler方法热幔。因此乐设,需要?jiǎng)?chuàng)建一個(gè)基礎(chǔ)的控制器類(lèi),所有的控制器要擴(kuò)展這個(gè)類(lèi)绎巨,從而繼承通用的@ExceptionHandler方法近尚。

?? Spring3.2引入了一個(gè)新的解決方案:控制器通知〕∏冢控制器通知是所有帶有@ControllerAdvice注解的類(lèi)戈锻,這個(gè)類(lèi)會(huì)包含一個(gè)或多個(gè)如下類(lèi)型的方法:

  • @ExceptionHandler注解標(biāo)注的方法;
  • @InitBinder注解標(biāo)注的方法和媳;
  • @ModelAttribute注解標(biāo)注的方法格遭;

?? @ControllerAdvice可以將所有的@ExceptionHandler方法收集到一個(gè)類(lèi)中,把所有的控制器異常進(jìn)行一致的處理留瞳。

添加ControllerAdviceHandler.java代碼并添加掃描:

package com.weyoung.framework.config;

import com.weyoung.framework.exception.BusinessException;
import com.weyoung.framework.web.Message;
import com.weyoung.platform.pojo.UserInfo;
import org.apache.log4j.Logger;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import static com.weyoung.framework.common.Constants.SESSION_DEFAULT;
import static com.weyoung.framework.common.ErrorConstants.EXCEPTION_SYSTEM_MSG;

/**
 * @作者 weyoung
 * @功能描述 給控制器請(qǐng)求添加默認(rèn)常用參數(shù)拒迅,統(tǒng)一處理異常
 * @日期 2019/3/4
 */
@ControllerAdvice
public class ControllerAdviceHandler {

    private static final Logger logger = Logger.getLogger(ControllerAdviceHandler.class);

    /**
     * @Description // 添加用戶(hù)信息,可以在Controller中獲取
     **/
    @ModelAttribute("BasUser")
    public UserInfo basUser(HttpServletRequest request) {
        HttpSession session = request.getSession(true);
        UserInfo user = (UserInfo) session.getAttribute(SESSION_DEFAULT);
        return user;
    }

    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public Message exceptionHandler(Exception ex) {
        // 處理業(yè)務(wù)異常
        if (ex instanceof BusinessException) {
            logger.error("BusinessException", ex);
            // 返回業(yè)務(wù)異常code和message;
            return Message.failed(((BusinessException) ex).getCode(), ex.getMessage());
        } else {
            logger.error("Exception", ex);
            return Message.failed(Message.FAILED_CODE, EXCEPTION_SYSTEM_MSG);
        }
    }
}

三她倘、處理業(yè)務(wù)異常

BusinessException.java

package com.weyoung.framework.exception;

import com.weyoung.framework.web.Message;

/**
 * @作者 weyoung
 * @功能描述 業(yè)務(wù)異常處理
 * @日期 2019/3/4
 */
public class BusinessException extends RuntimeException {

    private int code;

    public BusinessException(String message) {
        super(message);
        this.code = Message.FAILED_CODE;
    }

    public BusinessException(int code, String message) {
        super(message);
        this.code = code;
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }
}

測(cè)試璧微,在Controller中throw一個(gè)Exception,發(fā)現(xiàn)可以進(jìn)入該通知了帝牡,配置成功往毡。

在業(yè)務(wù)處理類(lèi)中遇到可預(yù)知或不可預(yù)知的錯(cuò)誤蒙揣,直接由程序攔截處理靶溜,我們開(kāi)發(fā)時(shí)只管throw Exception即可,控制器通知可以幫助我們處理和返回異常信息懒震。

個(gè)人認(rèn)為使用消息實(shí)體比如本文的Message類(lèi)來(lái)統(tǒng)一規(guī)范地處理異常罩息,不同的業(yè)務(wù)異常最好定義單獨(dú)的error code,產(chǎn)生異常的信息和具體原因整理成文檔个扰,這樣可以在上線之后不至于把敏感的錯(cuò)誤信息返回到前端瓷炮,又便于運(yùn)維、實(shí)施同事能夠快速地定位異常递宅。

相關(guān)文章推薦

源碼下載

?? 該項(xiàng)目持續(xù)更新中,會(huì)在代碼以及該文檔里面詳細(xì)注釋和介紹办龄。項(xiàng)目托管在<code>碼云</code>開(kāi)源平臺(tái)上烘绽,持續(xù)更新項(xiàng)目源碼鏈接:
https://gitee.com/nelucifer/ssm-note,點(diǎn)擊<code>克隆/下載</code>獲取該項(xiàng)目俐填。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末安接,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子英融,更是在濱河造成了極大的恐慌盏檐,老刑警劉巖歇式,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異胡野,居然都是意外死亡材失,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)给涕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)豺憔,“玉大人,你說(shuō)我怎么就攤上這事够庙」вΓ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵耘眨,是天一觀的道長(zhǎng)昼榛。 經(jīng)常有香客問(wèn)我,道長(zhǎng)剔难,這世上最難降的妖魔是什么胆屿? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮偶宫,結(jié)果婚禮上非迹,老公的妹妹穿的比我還像新娘。我一直安慰自己纯趋,他們只是感情好憎兽,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著吵冒,像睡著了一般纯命。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上痹栖,一...
    開(kāi)封第一講書(shū)人閱讀 51,182評(píng)論 1 299
  • 那天亿汞,我揣著相機(jī)與錄音,去河邊找鬼揪阿。 笑死疗我,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的南捂。 我是一名探鬼主播吴裤,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼黑毅!你這毒婦竟也來(lái)了嚼摩?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎枕面,沒(méi)想到半個(gè)月后愿卒,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡潮秘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年琼开,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片枕荞。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡柜候,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出躏精,到底是詐尸還是另有隱情渣刷,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布矗烛,位于F島的核電站辅柴,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏瞭吃。R本人自食惡果不足惜碌嘀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望歪架。 院中可真熱鬧股冗,春花似錦、人聲如沸和蚪。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)惠呼。三九已至导俘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背添坊。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工绍昂, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人崇摄。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親矫付。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

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

  • 在具體的SSM項(xiàng)目開(kāi)發(fā)中第焰,由于Controller層為處于請(qǐng)求處理的最頂層买优,再往上就是框架代碼的。因此,肯定需要在...
    Java大生閱讀 529評(píng)論 0 0
  • 前言 今天來(lái)一起學(xué)習(xí)一下Spring Boot中的異常處理杀赢,在日常web開(kāi)發(fā)中發(fā)生了異常烘跺,往往是需要通過(guò)一個(gè)統(tǒng)一的...
    嘟爺MD閱讀 25,815評(píng)論 8 79
  • 疲憊總是悄悄蔓延而來(lái) 像陽(yáng)光一樣的熱情倦怠了 思緒朦朦朧朧 靈感淹沒(méi)在冬天的深沉中 晨曦時(shí)出 夜靜時(shí)歸 外面的精彩...
    Doctor秀閱讀 282評(píng)論 0 0
  • 學(xué)習(xí)改變心態(tài) 投入創(chuàng)造幸福 20...
    陜縣2536王皂峽閱讀 292評(píng)論 1 1
  • 圖畫(huà),語(yǔ)言脂崔,公式等都是為了描述事物滤淳,而不是事物本身。當(dāng)我們發(fā)現(xiàn)好多的科技術(shù)語(yǔ)和公式時(shí)砌左,不要頭大脖咐,用用公式來(lái)描述要比...
    水原素閱讀 160評(píng)論 0 2