1. 程式人生 > >SSM框架全域性捕獲異常

SSM框架全域性捕獲異常

我們都知道,專案有兩種異常,一種是ERROR,一種是Exception,ERROR導致專案直接崩盤,無法執行,且不能捕獲,Exception可以捕獲且不影響專案執行,今天要做的就是捕獲Exception,當前專案開發使用SSM框架,我原本使用的方法是Controller控制層每一個類每一個方法都有一個try-catch捕獲當前方法異常,雖然這種可用,但是會有幾個問題:

  • 向前端如何返回異常?
    即如何保證發生異常時向前端返回的資料統一,因為是不同人員開發,很可能A人員直接將異常扔給前端,而B人員將異常處理之後返回前端一個標識
  • 如何記錄異常資訊?
    我們要考慮到系統中每一處程式碼都有發生異常的可能性(在這裡先僅考慮Controller層),即使我們編寫異常記錄的工具類,難道我們在每處發生異常的地方都呼叫嗎?(不談資源浪費的情況下,如何確保每個開發人員記錄格式相同?如何確保每處Exception都會被記錄?)

基於以上兩點,我基於SSM框架做了一個Exception的全域性捕獲(親測有效)
在這裡插入圖片描述
在這裡即使用GlobalExceptionHandler類捕獲控制層的異常,程式碼如下:

package org.jit.sose.exception;
import java.util.HashMap;
import java.util.Map;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
/**
 * 全域性捕獲異常
 */
@ControllerAdvice(basePackages = "org.jit.sose.controller")
public class GlobalExceptionHandler {

	@ExceptionHandler(RuntimeException.class)
	@ResponseBody
	public Map<String, Object> exception(Exception e) {
		Map<String, Object> map = new HashMap<>();
		System.out.println("全域性捕獲異常統計");
		e.printStackTrace();
		map.put("info", "error");
		return map;
	}
}

@ControllerAdvice註解將作用在所有註解了@RequestMapping的控制器的方法上,basePackages代表指定包下面的方法,可以使用不同的類處理不同的異常。
@ExceptionHandler(RuntimeException.class)用於全域性處理控制器裡的異常,在這裡我們只處理執行時異常。
@ResponseBody標識返回JSON格式。
引數裡面加上Exception之後就可以使用e.printStackTrace()在控制檯打印出異常,在這裡將打印出的異常儲存進日誌檔案(後期補充)方便檢視,這樣我們就不需要在每個控制層方法裡面寫多餘的程式碼了。
在使用這個全域性方法之前,我的控制層程式碼如下:

// 刪除
@RequestMapping(value = "/delete.sose", method = RequestMethod.POST, consumes = "application/json;charset=UTF-8")
public Map<String, Object> delete(@RequestBody String c) throws ParseException {
	java.util.Map<String, Object> map = new HashMap<>();
	try {
		// 獲取前端傳回刪除資料Id
		JSONObject strj = new JSONObject(c);
		evolveService.delete(strj.getInt("id"));
		map.put("info", "success");
	} catch (Exception e) {
		e.printStackTrace();
		map.put("info", e);
	}
	return map;
}

只是一個簡單的刪除操作,只是傳一個標識到後端但是為了捕獲異常並打印出來多寫了五行程式碼,整個專案就多寫了近2000行費程式碼,自己看著都煩心。
使用全域性捕獲之後能夠確保每處異常都能捕獲且列印,方便記錄,減少程式碼量,異常的返回值統一(前端輕鬆)