使用dynamic引發的異常:無法對 null 引用執行運行時綁定
阿新 • • 發佈:2017-09-22
system 聯系 ant 重新 負責 records sys 運行時 amp
今天上午運營反映有商戶的賬單沒有生成。
查看日誌,在批量生成賬單服務執行過程中,因為如下異常而中斷了:
跑批異常 Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 無法對 null 引用執行運行時綁定 在 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的項。
通過連接生產讀庫執行測試用例,驗證了這一點。這個List<dynamic>裏,果然有Date是空值的記錄。Date來自於db裏支付單記錄表的支付時間,有一個商戶的已支付完成的支付單的支付時間是null,從系統業務邏輯的角度來說,支付完成的訂單一定要有支付時間的,否則會導致賬單數據錯誤。
接下來,聯系運維,執行update來修復這條記錄的支付時間,然後重新跑賬單,問題得以解決。當然,負責支付的夥伴得查查支付時間是null的原因並及時修復。
使用dynamic引發的異常:無法對 null 引用執行運行時綁定