openAPI增加統(tǒng)一異常處理機(jī)制

這里任務(wù)三點(diǎn)要求

1.是異常統(tǒng)一處理

2.是返回格式必須是json格式

3.打印日志信息

這里首先要明確一點(diǎn)就是程序員在寫代碼時(shí)候肯定沒解決的問題都是

throw newException();進(jìn)行拋出去的只要明確這一點(diǎn)。

第二點(diǎn)就是什么是json格式我們必須清楚

{ error: "system error", code: "0001", msg: "系統(tǒng)錯(cuò)誤" }

第三點(diǎn)要明確知道日志信息如何打印。

這里我先給出具體代碼在進(jìn)行解釋說明

首先我給出json格式如何解決的問題,如果是類返回頁面直接是json格式,但是這里是json類,沒辦法我是通過toString方法直接重新寫了json格式,然后調(diào)用這個(gè)方法,返回解釋json格式了

這里還是提醒一下做統(tǒng)一異常處理的人,我的經(jīng)驗(yàn),統(tǒng)一異常處理并不是處處都可以,就比如過濾器和攔截器,因?yàn)樵谧咴陧?xiàng)目之前,會先走過濾器和攔截器,因?yàn)轫?xiàng)目中的統(tǒng)一異常還沒走,所以統(tǒng)一異常處理是攔截不了,你如果想處理,只能拋出來自己解決。沒辦法

packagecom.zenhome.cloud2cloud.config.Exception;

/**

* Created by Qian on 2017/3/14.

*/

public enumErrorInfos {

SPRINGSERVER_ERROR("0001","system error","系統(tǒng)錯(cuò)誤"),

NULLPOINTER("0002","null pointer","系統(tǒng)錯(cuò)誤"),

NUMBERSINABNORMAL("0003","numbers in abnormal","系統(tǒng)錯(cuò)誤");

privateStringcode;

privateStringmsg;

privateStringerror;

privateErrorInfos(String code, String error, String msg) {

this.error=error;

this.code= code;

this.msg= msg;

}

publicString getCode() {

returncode;

}

publicString getMsg() {

returnmsg;

}

publicString getError() {

returnerror;

}

publicString toString(){

return"{ "+"error: "+"\""+error+"\""+", code: "+"\""+code+"\""+", msg: "+"\""+msg+"\""+" }";

}

}

這里在給出正式解決統(tǒng)一異常處理

新建一個(gè)類GlobalDefaultExceptionHandler,

在class注解上@ControllerAdvice,

在方法上注解上@ExceptionHandler(value = Exception.class),具體代碼如下:staticLoggerlogger= LogManager.getLogger(GlobalExceptionHandler.class.getName());

這句話相當(dāng)于聲明日志信息可以調(diào)用,日志具體信息我在最后會給出

e.getClass().isInstance(NullPointerException.class判斷錯(cuò)誤信息是否一致,一致就打印信息

logger.warn("錯(cuò)誤提示"+e.getMessage());控制臺打印日志錯(cuò)誤信息

String error= ErrorInfos.SPRINGSERVER_ERROR.toString();這就是json格式調(diào)用toString方法

packagecom.zenhome.cloud2cloud.config.Exception;

importorg.apache.logging.log4j.LogManager;

importorg.apache.logging.log4j.Logger;

importorg.springframework.web.bind.annotation.ControllerAdvice;

importorg.springframework.web.bind.annotation.ExceptionHandler;

importorg.springframework.web.bind.annotation.ResponseBody;

importjavax.servlet.http.HttpServletRequest;

importjavax.servlet.http.HttpServletResponse;

/**

* Created by Qian on 2017/3/13.

*/

@ControllerAdvice

public classGlobalExceptionHandler {

staticLoggerlogger= LogManager.getLogger(GlobalExceptionHandler.class.getName());

@ExceptionHandler(value = Exception.class)

@ResponseBody

publicString jsonErrorHandler(HttpServletRequest req, HttpServletResponse res, Exception e)throwsException {

logger.warn("錯(cuò)誤提示"+e.getMessage());

if(e.getClass().isInstance(NullPointerException.class)){

String error= ErrorInfos.NULLPOINTER.toString();

returnerror;

}else if(e.getClass().isInstance(NumberFormatException.class)){

String error= ErrorInfos.NUMBERSINABNORMAL.toString();

returnerror;

}else{

String error= ErrorInfos.SPRINGSERVER_ERROR.toString();

returnerror;

}

}

}

這里我給出實(shí)體類吧

可以測試的

packagecom.zenhome.cloud2cloud.config.Exception;

importorg.springframework.web.bind.annotation.RequestMapping;

importorg.springframework.web.bind.annotation.RestController;

importjava.util.HashMap;

importjava.util.Map;

/**

* 測試錯(cuò)誤能否丟出去統(tǒng)一處理

*/

@RestController

public classControl {

@RequestMapping("/json3")

public voidjson3(intx)throwsException{

Map map =newHashMap();

try{

inta =100/x;

}catch(Exception e) {

throw newException();

}

}

}

最后給出打印日志的具體詳解用法

packagecom.didispace.demo;

importorg.apache.log4j.Level;

importorg.apache.log4j.LogManager;

importorg.apache.log4j.Logger;

/**

* Created by Qian on 2017/3/15.

*/

public classHello {

/* static Logger logger = LogManager.getLogger(Hello.class.getName());*/

/* public boolean hello() {

*//* logger.entry();*//* //trace級別的信息,單獨(dú)列出來是希望你在某個(gè)方法或者程序邏輯開始的時(shí)候調(diào)用,和logger.trace("entry")基本一個(gè)意思

logger.error("Did it again!"); //error級別的信息,參數(shù)就是你輸出的信息

logger.info("我是info信息"); //info級別的信息

logger.debug("我是debug信息");

logger.warn("我是warn信息");

logger.fatal("我是fatal信息");

logger.log(Level.DEBUG, "我是debug信息"); //這個(gè)就是制定Level類型的調(diào)用:誰閑著沒事調(diào)用這個(gè),也不一定哦!

*//* logger.exit();*//* //和entry()對應(yīng)的結(jié)束方法,和logger.trace("exit");一個(gè)意思

return false;

}*/

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容