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


今天上午運營反映有商戶的賬單沒有生成。

查看日志,在批量生成賬單服務執行過程中,因為如下異常而中斷了:

跑批異常 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的原因並及時修復。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM