利用自定義異常來(lái)重構(gòu)代碼

先貼出來(lái)代碼

public void ProcessRequest(HttpContext context)
{
    context.Response.ContentType = "text/plain";
    string jsonStr = "";
    var oReturnValue = new ReturnValue("9999", "無(wú)參數(shù)");
    if (context.Request.Form.AllKeys.Length > 0)
    {
        try
        {
            var oAlipayRefundApply = new RefundApplyDTO
            {
                OrderNo = context.Request.Form["on"],
                OrderAmount = context.Request.Form["oa"],
                Remark = context.Request.Form["or"]
            };
            var dt = new DataTable();
            var listOrderNo = new List<string>();
            var dicMoney = new Dictionary<string, string>();
            var dicRemark = new Dictionary<string, string>();
            oReturnValue = new AlipayPaymentBLL.AlipayRefundRecord().BuilderArray(listOrderNo, dicMoney, dicRemark, oAlipayRefundApply);//解析傳入?yún)?shù)信息
            if (oReturnValue.Code == "0000")
            {
                oReturnValue = new AlipayPaymentBLL.AlipayRefundRecord().DoRefund(oAlipayRefundApply, dt, listOrderNo, dicMoney, dicRemark);
                if (oReturnValue.Code == "0000")
                {
                    oReturnValue = BuilderRequest(dt);
                }
            }
        }
        catch (Exception ex)
        {
            CommonUtils.LogCommon.instance.writePay(this, "支付寶退款請(qǐng)求組建異常:" + ex);
            oReturnValue = new ReturnValue("9999", "請(qǐng)求發(fā)生異常");
        }
    }

    jsonStr = JsonConvert.SerializeObject(oReturnValue);
    context.Response.Write(jsonStr);
}

代碼分析

以上是一個(gè)一般處理程序(.ashx文件)的類(lèi)文件里的主方法ProcessRequest的方法體。
不考慮邏輯蚂四,僅從代碼簡(jiǎn)潔的角度來(lái)看光戈,如上代碼段存在如下問(wèn)題:

  • 變量/對(duì)象oReturnValue被重復(fù)賦值并使用
  • 層層判斷嵌套
  • ReturnValue的構(gòu)造器是兩個(gè)string參數(shù)。我要說(shuō)的是第一個(gè)參數(shù)code遂赠,在這段代碼里久妆,code取值只有0000和9999這兩種值,分別代表成功和失敗跷睦。這時(shí)筷弦,不如直接改為true/false更直觀

如下是ReturnValue類(lèi)的定義:

public class ReturnValue
{
    /// <summary>
    /// 錯(cuò)誤碼
    /// </summary>
    private string _code;

    /// <summary>
    /// 錯(cuò)誤信息
    /// </summary>
    private string _msg;

    public ReturnValue(string code, string msg)
    {
        _code = code;
        _msg = msg;
    }

    public string Code { get { return _code; } }
    public string MsgStr { get { return _msg; } }
}

代碼重構(gòu)

從如下幾個(gè)角度進(jìn)行重構(gòu):

  • 封裝處理方法,主方法里統(tǒng)一做try..catch的異常捕獲處理
  • 引入自定義異常抑诸, 當(dāng)判斷失敗時(shí)烂琴,返回自定義異常。這樣可以去掉很多if的嵌套蜕乡。
  • 修改接口返回值類(lèi)型

重構(gòu)后的代碼如下:

HttpRequest _ctxRequest;
public void ProcessRequest(HttpContext context)
{
    context.Response.ContentType = "text/plain";
    _ctxRequest = context.Request;
    ResponseModel oReturnValue = null;
    try
    {
        oReturnValue = ProcessRequestAndReturnFormHtml();
        CommonUtils.LogCommon.instance.writePay(this, "支付寶退款請(qǐng)求處理完成");
    }
    catch (Exception ex)
    {
        if (ex is ResponseErrorException)
        {
            oReturnValue = new ResponseModel(false, ex.Message);
            CommonUtils.LogCommon.instance.writePay(this, "支付寶退款請(qǐng)求處理失敿楸痢:" + ex.Message);
        }
        else
        {
            CommonUtils.LogCommon.instance.writePay(this, "支付寶退款請(qǐng)求處理出現(xiàn)異常:" + ex.ToString());
            oReturnValue = new ResponseModel(false, "請(qǐng)求發(fā)生異常");
        }
    }
    string jsonStr = JsonConvert.SerializeObject(oReturnValue);
    context.Response.Write(jsonStr);
}

private ResponseModel ProcessRequestAndReturnFormHtml()
{
    var oReturnValue = new ReturnValue("9999", "無(wú)參數(shù)");
    if (_ctxRequest.Form.AllKeys.Length > 0)
    {
        throw new ResponseErrorException("無(wú)參數(shù)");
    }
    var oAlipayRefundApply = new RefundApplyDTO
    {
        OrderNo = _ctxRequest.Form["on"],
        OrderAmount = _ctxRequest.Form["oa"],
        Remark = _ctxRequest.Form["or"]
    };

    var dt = new DataTable();
    var listOrderNo = new List<string>();
    var dicMoney = new Dictionary<string, string>();
    var dicRemark = new Dictionary<string, string>();
    var alipayPaymentBLL = new AlipayPaymentBLL.AlipayRefundRecord();
    alipayPaymentBLL.BuilderArray(listOrderNo, dicMoney, dicRemark, oAlipayRefundApply);//解析傳入?yún)?shù)信息
    alipayPaymentBLL.DoRefund(oAlipayRefundApply, dt, listOrderNo, dicMoney, dicRemark);// 發(fā)起退款,并獲得結(jié)果做相應(yīng)處理
    string formHtml = BuildRequestFormHtml(dt);// 創(chuàng)建支付寶請(qǐng)求(Form表單)
    return new ResponseModel(true, formHtml);
}

可見(jiàn)层玲,代碼清晰了很多健盒。主要的方式是引入了自定義異常ResponseErrorException,使得方法只管返回理想情況下應(yīng)該返回的參數(shù)類(lèi)型称簿,而現(xiàn)實(shí)很骨感,所以惰帽,當(dāng)不滿足判斷條件時(shí)憨降,就通過(guò)拋出自定義異常的方式來(lái)實(shí)現(xiàn),同時(shí)也沒(méi)有破壞方法的結(jié)構(gòu)该酗。 另外授药,我將異常捕獲統(tǒng)一放到了主方法ProcessRequest里士嚎,也使得代碼結(jié)構(gòu)清晰,少了那些if的判斷悔叽,是不是很漂亮莱衩?

同時(shí),涉及到的改動(dòng)還有相關(guān)的上下游的引用:

1. 前端js在對(duì)響應(yīng)的判斷要由判斷0000/9999改為true/false

var url = "ExcuteRefund.ashx";
$.ajax({
    url: url,
    type: "POST",
    dataType: "json",
    data: { "on": arr[0], "oa": arr[1], "or": arr[2] },
    success: function (result) {
        if (result !== "") {
            var jsonData = eval(result);
            if (jsonData.Code === "0000") {
                $(".table_MidGl").html("");
                $(".table_MidGl").append(jsonData.MsgStr);
            } else {
                alert(jsonData.MsgStr);
                window.location.reload();
                return false;
            }

2. 所引用的方法娇澎,AlipayRefundRecord.BuilderArray()笨蚁、AlipayRefundRecord.DoRefund()和本類(lèi)里的BuildRequestFormHtml(),如下是BuildRequestFormHtml()的改動(dòng)

private string BuildRequestFormHtml(DataTable dt)
{
    ......
    var sortedDicPara = obll.GetRefundParameters(CommonModel.PayCenterConfig.PayPartner.PayPartnerEnums.AlipayApp, dt, ref sInputCharset, ref sLinkString, out sMsg);
    if (!sortedDicPara.Any())
    {
        throw new ResponseErrorException(sMsg);
    }

    //拼接url'?'后條件
    string payUrlValueStr = string.Format("{0}&sign={1}&sign_type={2}",
                                            sLinkString,
                                            sortedDicPara["sign"],
                                            sortedDicPara["sign_type"]
                                        );

    //發(fā)起退款URL
    string url = new CommonModel.PayCenterConfig.ServerURLConfig(CommonModel.PayCenterConfig.PayPartner.PayPartnerEnums.AlipayApp).REFUND_URL;
    CommonUtils.LogCommon.instance.writePay(this, "進(jìn)入支付寶退款趟庄,發(fā)起消息: " + url + payUrlValueStr);
    string formHtml = WebCommon.BuildRequest(sortedDicPara, "post", "確認(rèn)", url, sInputCharset);
    CommonUtils.LogCommon.instance.writePay(this, "進(jìn)入支付寶退款括细,發(fā)起消息(form表單): " + formHtml);
    return formHtml;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市戚啥,隨后出現(xiàn)的幾起案子奋单,更是在濱河造成了極大的恐慌,老刑警劉巖猫十,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件览濒,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡拖云,警方通過(guò)查閱死者的電腦和手機(jī)贷笛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)江兢,“玉大人昨忆,你說(shuō)我怎么就攤上這事∩荚剩” “怎么了邑贴?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)叔磷。 經(jīng)常有香客問(wèn)我拢驾,道長(zhǎng),這世上最難降的妖魔是什么改基? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任繁疤,我火速辦了婚禮,結(jié)果婚禮上秕狰,老公的妹妹穿的比我還像新娘稠腊。我一直安慰自己,他們只是感情好鸣哀,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布架忌。 她就那樣靜靜地躺著,像睡著了一般我衬。 火紅的嫁衣襯著肌膚如雪叹放。 梳的紋絲不亂的頭發(fā)上饰恕,一...
    開(kāi)封第一講書(shū)人閱讀 51,554評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音井仰,去河邊找鬼埋嵌。 笑死,一個(gè)胖子當(dāng)著我的面吹牛俱恶,可吹牛的內(nèi)容都是我干的雹嗦。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼速那,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼俐银!你這毒婦竟也來(lái)了工坊?” 一聲冷哼從身側(cè)響起内颗,我...
    開(kāi)封第一講書(shū)人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎晋被,沒(méi)想到半個(gè)月后荔烧,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體吱七,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年鹤竭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了踊餐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡臀稚,死狀恐怖吝岭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情吧寺,我是刑警寧澤窜管,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站稚机,受9級(jí)特大地震影響幕帆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜赖条,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一失乾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧纬乍,春花似錦碱茁、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至诅蝶,卻和暖如春退个,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背调炬。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工语盈, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人缰泡。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓刀荒,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親棘钞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子缠借,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容