1. 程式人生 > >Spring運用(三)------全域性異常處理(HandlerExceptionResolver)

Spring運用(三)------全域性異常處理(HandlerExceptionResolver)

前言

大家在使用Spring框架編寫Controller的時候,都會遇到這樣一種情況,就是想做一個全域性異常處理,目的是不要每個人都單獨攔截處理系統類的異常。

正文

下面我將介紹一種方法,利用HandlerExceptionResolver做一個統一的異常攔截處理,當然這種方式只適用於沒有手動攔截異常請求的情況,如果某一個Controller自己攔截並處理了異常,不會被這個統一異常處理所覆蓋到。

實現

步驟一,準備Resolver

package com.op.exception;

import com.google.gson.Gson;
import com.op.common.ResultJson;
import
org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; /** */
public class ServiceExceptionResolver implements HandlerExceptionResolver { private static final Logger logger = LoggerFactory.getLogger(ServiceExceptionResolver.class); @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { try
{ PrintWriter printWriter = response.getWriter(); //返回結果封裝類 ResultJson resultJson = new ResultJson(); //業務異常的時候,按照各業務自身的異常訊息進行返回 if (ex instanceof ServiceDataException) { resultJson.setCode(((ServiceDataException) ex).getCode()); resultJson.setMessage(ex.getMessage()); } else {//非業務異常的時候,統一處理為系統異常訊息進行返回 resultJson.setCode(500); logger.error("系統異常,請稍後嘗試!", ex); resultJson.setMessage("系統異常,請稍後嘗試!"); } Gson gson = new Gson(); String json = gson.toJson(resultJson); logger.error("全域性異常處理!返回結果:{}", json, ex); response.setContentType("application/json;charset=UTF-8"); //返回json資料。 printWriter.println(json); printWriter.close(); } catch (IOException e) { logger.error(e.getMessage(), e); } return null; } }

這個示例圍繞兩個異常點來設計:

一個是業務異常,即開發者自己攔截的可以預知的異常;
一個是非業務異常,即開發者未攔截的不可預知的異常;

從實現中可以看出來這個異常處理最終應該返回到指定的頁面,但是我們這裡作為對前端提供的API介面,我們會統一處理為Json的形式並直接返回此內容。因此這裡的return null並不是沒有處理,而是直接將返回內容輸出到了終端!

步驟二,返回處理結果類ResultJson

示例中涉及到一個ResultJson返回處理結果類,其實其內容很簡單:

package com.op.common;

public class ResultJson {
    public int code;
    public String message;
    public Object data;

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

    public ResultJson() {
        this.code = Constants.SUCCESS_CODE;
        this.message = "success";
    }

    public int getCode() {
        return code;
    }

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

    public String getMessage() {
        return message;
    }

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

    public Object getData() {
        return data;
    }

    public ResultJson setData(Object data) {
        this.data = data;
        return this;
    }
}

步驟三,配置該Bean

<bean class="com.op.exception.ServiceExceptionResolver"/>

在你的配置檔案中定義該Bean即可,Spring容器會掃描所有實現了HandlerExceptionResolver介面的異常處理器,統一處理!

相關推薦

Spring運用------全域性異常處理HandlerExceptionResolver

前言 大家在使用Spring框架編寫Controller的時候,都會遇到這樣一種情況,就是想做一個全域性異常處理,目的是不要每個人都單獨攔截處理系統類的異常。 正文 下面我將介紹一種方法,利用HandlerExceptionResolver做一個統一的

Spring Boot 學習筆記十三——全域性異常處理

預設異常處理機制 1、Whitelabel Error Page 當客戶端訪問頁面不存在,或服務端處理髮生異常,一般瀏覽器客戶端傳送的請求頭中為:Accept:text/html;所以就返回一個html文件。 這裡有一個很重要的類:BasicErrorContr

spring-boot-route全域性異常處理

在開發中,我們經常會使用`try/catch塊`來捕獲異常進行處理,如果有些程式碼中忘記捕獲異常或者不可見的一些異常出現,就會響應給前端一些不友好的提示,這時候我們可以使用全域性異常處理。這樣就不用在程式碼中寫那些煩人的`try/catch塊了`,程式碼的可讀性也會提高。 SpringBoot提供的的註解`

spring boot 1.5.4 統一異常處理

springboot springboot1.5.4 springboot整合springdatajpa springboot集成jdbctemplate springboot異常處理 上一篇:springboot 1.5.4 配置文件詳解(八) 1 Spring Boot統一異

Struts2 -- 全域性異常處理攔截器

注:不足之處沒對ajax請求無法實現頁面跳轉控制(無法跳到錯誤頁面) <package name="InterceptorPackage" extends="struts-default"&

JAVA學習第十九課java程序的異常處理

num 函數 錯誤 style col 編譯失敗 return [] java 異常處理的捕捉形式: 這是能夠對異常進行針對性處理的方式 六、try、catch的理解 詳細格式: try { //須要被檢測異常的代碼 } catch(異常類 變量)//改變量用

Spring Boot 2 Webflux的全域性異常處理

本文首先將會回顧Spring 5之前的SpringMVC異常處理機制,然後主要講解Spring Boot 2 Webflux的全域性異常處理機制。 SpringMVC的異常處理 Spring 統一異常處理有 3 種方式,分別為: 使用 @ExceptionHandler 註解 實現 Handl

C# 中的異常捕捉try異常處理catch

        為了捕捉異常,程式碼要放到一個 try 塊中(try 是 C# 關鍵字)。程式碼執行時它會嘗試執行 try 塊內的所有語句。如果沒有任何語句產生一個異常,這些語句將一個接一個執行,直到全部完成。然而,一旦出現異常,就會跳出 try 塊,並進入一個 catch 處理程式中執行。      

Spring MVC 解析之 DispatcherServlet之異常處理機制HandlerExceptionResolver

springMVC對Controller執行過程中出現的異常提供了統一的處理機制,其實這種處理機制也簡單,只要丟擲的異常在DispatcherServlet中都會進行捕獲,這樣就可以統一的對異常進行處理。 springMVC提供了一個HandlerExcepti

SpringMVC之全域性異常處理 ——統一返回格式自定義異常

SpringMVC之全域性異常處理 老規矩開篇咱們先介紹一下背景 因當前APP越來越流行,或是提供的第三方介面等等都需要你來統一返回格式。這個時候問題就來了 ,很多時候系統的異常以及為了程式碼的可讀性我們必然會抽出很多的間接層(例如資料格式校驗、資料有效性校驗等),一層層的retur

Spring Cloud實戰小貼士:Zuul統一異常處理

在前幾天釋出的《Spring Cloud實戰小貼士:Zuul統一異常處理(一)》一文中,我們詳細說明了當Zuul的過濾器中丟擲異常時會發生客戶端沒有返回任何內容的問題以及針對這個問題的兩種解決方案:一種是通過在各個階段的過濾器中增加try-catch塊,實現過濾器內部的異常處理;另一種是

spring mvc 異常處理

連結:http://gaojiewyh.iteye.com/blog/1297746 (附原始碼)  連結:http://zywang.iteye.com/blog/983801   連結:http://www.cnblogs.com/xguo/p/3163519.html

Spring Mvc使用Jackson進行json轉物件時,遇到的字串轉日期的異常處理Can not deserialize value of type Date from String

1、問題排查出現的場景:服務端通過springmvc寫了一個對外的介面,返回一個json字串,其中該json帶有日期,格式為yyyy-MM-dd HH:mm:ss客戶端通過feign呼叫該http介面,指定返回值為一個Dto,Dto中日期的欄位為Date型別客戶端呼叫該介面後

Springboot十一@ControllerAdvice全域性異常處理

前言:       @ControllerAdvice,用於全域性異常處理,減少程式碼入侵,必須在controller層丟擲來,若異常在程式碼中被抓住了,沒有丟擲來,是不起作用的。實現:     寫一個全域性異常類GlobalDefaultException,類上加註解@Re

從零開始搭建前後端分離的NetCore2.2EF Core CodeFirst+Autofac+Vue的專案框架之五全域性異常處理

  在 上一篇 中講到了在NetCore專案中如何配置NLog將日誌存到資料庫,這篇中將講述如何處理自定義丟擲的異常以及未處理的異常,並通過日誌記錄下來。   為什麼要進行異常的全域性處理和記錄日誌呢?   在實際的軟體專案開發與迭代中,無論程式設計師是久經沙場的老將,還是初出茅廬的萌新,

Servlet 異常處理 配置錯誤頁面

使用 程序 頁面 sco class exception clas type load 當一個 Servlet 拋出一個異常時,Web 容器在使用了 exception-type 元素的 web.xml 中搜索與拋出異常類型相匹配的配置。 您必須在 web.xml 中使用

springMVC --全局異常處理兩種方式

nal font method mil -h util 一個 fail space 首先看springMVC的配置文件: <!-- 全局異常配置 start --> <bean id="exceptionResolv

Python基礎19_異常處理

poi 錯誤處理 turn 清晰 system 由於 對象 編譯 sharp 一、異常處理 錯誤和異常: 1、錯誤的種類:   1)語法錯誤:這種錯誤,根本過不了python解釋器的語法檢測,必須在程序執行前就改正   2)邏輯錯誤:       例如: res1=1/0

實習培訓——Java異常處理8

如何工作 出了 我們 個數 試圖 類對象 bject epo 很多 實習培訓——Java異常處理(8) Java 異常處理 異常是程序中的一些錯誤,但並不是所有的錯誤都是異常,並且錯誤有時候是可以避免的。 比如說,你的代碼少了一個分號,那麽運行出來結果是提示是錯誤 java

記錄一次網站漏洞修復過程():第二輪處理攔截SQL註入、跨站腳本攻擊XSS

cat nbsp ebe 嵌入 網頁 防止 記錄 用戶輸入 light 在程序編寫的時候采用參數化的SQL語句可以有效的防止SQL註入,但是當程序一旦成型,再去修改大量的數據庫執行語句並不是太現實,對網頁表單上輸入進行校驗是易於實現的方法。在webForm 頁面中開啟校驗屬