1. 程式人生 > >使用dynamic引發的異常:無法對 null 引用執行運行時綁定

使用dynamic引發的異常:無法對 null 引用執行運行時綁定

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 引用執行運行時綁定