今天上午運營反映有商戶的賬單沒有生成秉溉。
查看日志厨钻,在批量生成賬單服務執(zhí)行過程中,因為如下異常而中斷了:
跑批異常 Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 無法對 null 引用執(zhí)行運行時綁定
在 CallSite.Target(Closure , CallSite , Object )
在 System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,TRet](CallSite site, T0 arg0)
在 GateWay.BLL.Orders.PayFilesGenerator.Generate()
接下來看程序代碼:
1 try
2 {
3 //查找distinct后的“商戶&日期”
4 var map = orderDal.GetMerchantsForSettlement(_frDate, _toDate);
5 if (map == null)
6 {
7 _logHelper.WriteLog("no records");
8 return;
9 }
10 _logHelper.WriteLog("獲取到{0}條“商戶&日期”對兒", map.Count);
11 int i = 0;
12 //遍歷“商戶&日期”集合坚嗜,逐一查詢出來訂單然后生成文件
13 foreach (var p in map)
14 {
15 i++;
16 _logHelper.WriteLog("[{2}] 商戶:{0}-文件日期:{1}", p.MerCode, p.Date.ToShortDateString(), i);
17 try
18 {
19 var isOK = Generate(p.MerCode, p.Date);
20 _logHelper.WriteLog("[{0}]生成文件返回{1}", i, isOK);
21 }
22 catch (Exception ex)
23 {
24 if (ex is ResponseErrorException)
25 {
26 _logHelper.WriteLog("[{0}]{1}", i, ex.Message);
27 }
28 else
29 {
30 _logHelper.WriteLog("[{0}]文件生成異常 {1}", i, ex.ToString());
31 }
32 }
33 }
34 }
35 catch (Exception ex)
36 {
37 _logHelper.WriteLog("跑批異常 {0}", ex.ToString());
38 }
39
40 _logHelper.WriteLog("本次批量生成賬單文件結束.");
41 }
其中夯膀,GetMerchantsForSettlement方法的返回值是一個List<dynamic>
分析可知,異常一定是在第16行拋出的苍蔬。
進一步分析诱建,自然是調用p.Date的.ToShortDateString()方法出現這個異常了,也就是說這個集合里存在Date為null的項碟绑。
通過連接生產讀庫執(zhí)行測試用例俺猿,驗證了這一點。這個List<dynamic>里格仲,果然有Date是空值的記錄押袍。Date來自于db里支付單記錄表的支付時間,有一個商戶的已支付完成的支付單的支付時間是null凯肋,從系統(tǒng)業(yè)務邏輯的角度來說谊惭,支付完成的訂單一定要有支付時間的,否則會導致賬單數據錯誤侮东。
接下來圈盔,聯(lián)系運維,執(zhí)行update來修復這條記錄的支付時間悄雅,然后重新跑賬單驱敲,問題得以解決。當然宽闲,負責支付的伙伴得查查支付時間是null的原因并及時修復众眨。