天天看點

程式中對異常情況的處理

目前開發的一個項目

開發一個新功能,總是感覺很吃力,

因為總是要處理各種協作方接口異常情況:

(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