使用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的原因并及时修复。
当看到一些不好的代码时,会发现我还算优秀;当看到优秀的代码时,也才意识到持续学习的重要!--buguge
本文来自博客园,转载请注明原文链接:https://www.cnblogs.com/buguge/p/7574146.html