目前開發的一個項目
開發一個新功能,總是感覺很吃力,
因為總是要處理各種協作方接口異常情況:
(a)502 伺服器沒有啟動
(b)403 拒絕通路
(c)404 接口路徑不對
(d)500 伺服器内部錯誤
如果把這些錯誤資訊一層層往上傳回,會非常麻煩
在業務邏輯中參雜了這些與業務一點關系都沒有的代碼,看起來很累贅.
看下面的代碼:
錯誤是一步步往上傳遞,每一個方法裡面都在處理,感覺好累
最下面的代碼片段是控制器裡面的,
在其他控制器裡面也會看到類似的代碼
其實可以統一處理的
這些異常應該在一個地方統一捕獲,統一處理.
而不是東處理一個,西處理一個,看起來很亂,容易造成備援和重複,很難維護.
下面我就漏改了:
如何實作異常統一處理呢?
第一,遇到異常直接抛出,而不是馬上處理;
第二,一個異常handler進行統一處理
handler 類:
package com.chanjet.gov.handler;
import com.chanjet.gov.bean.exception.mustbedealedexception;
import com.chanjet.gov.util.constant;
import org.springframework.web.bind.annotation.controlleradvice;
import org.springframework.web.bind.annotation.exceptionhandler;
import org.springframework.web.context.request.requestcontextholder;
import org.springframework.web.context.request.servletrequestattributes;
import javax.servlet.http.httpservletresponse;
import java.io.ioexception;
/**
* created by whuanghkl on 3/30/16.
*/
//注意使用注解@controlleradvice作用域是全局controller範圍
//可應用到所有@requestmapping類或方法上的@exceptionhandler、@initbinder、@modelattribute,在這裡是@exceptionhandler
@controlleradvice
public class exceptionhandleradvice {
@exceptionhandler(mustbedealedexception.class)
// @response_contenttype_json_utfstatus(httpstatus.bad_request)
// @responsebody
public string handleioexception(mustbedealedexception ex) {
// return classutils.getshortname(ex.getclass()) + ex.getmessage();
system.out.println(ex);
httpservletresponse response = ((servletrequestattributes) requestcontextholder.getrequestattributes()).getresponse();
string responsestatuscode = ex.getresponsestatuscode();
if (null == responsestatuscode) {
responsestatuscode = constant.empty;
}
try {
response.sendredirect("/error.html?error=" + ex.geterrorcode() + "&responsestatuscode=" + responsestatuscode);
} catch (ioexception e) {
e.printstacktrace();
return null;
}
}
參考:http://www.cnblogs.com/xguo/p/3163519.html