美文网首页程序员
使用dynamic引发的异常:无法对 null 引用执行运行时绑

使用dynamic引发的异常:无法对 null 引用执行运行时绑

作者: buguge | 来源:发表于2017-09-22 12:03 被阅读325次

今天上午运营反映有商户的账单没有生成。

查看日志,在批量生成账单服务执行过程中,因为如下异常而中断了:

跑批异常 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()
202192-20170922113610603-1932336348.png

接下来看程序代码:

 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 引用执行运行时绑

    今天上午运营反映有商户的账单没有生成。 查看日志,在批量生成账单服务执行过程中,因为如下异常而中断了: 接下来看程...

  • Effective C#

    1.使用as或is的优势:如果无法进行转换,则 null 而非引发异常,只需要检查返回的引用是否为null即可,避...

  • 13.OC和Swift混编

    OC 和 Swift 运行时简介 Objective-C 运行时 动态类型(dynamic typing) 动态绑...

  • kotlin-内置函数let、also、with、run、app

    使用带let的安全调用 若name是可空类型,且真为 null 时,? 后的代码块不会执行,不会引发空指针异常。 ...

  • Java语言中的异常

    1、异常分类 从产生源头来看,Java语言中的异常可以分为两类: JVM抛出的异常。比如:访问null引用会引发N...

  • jvm如何处理抛异常

    抛异常显式:代码加 throw隐式:jvm运行时,无法正常执行,如数组索引越界 捕获异常try:需要进行异常监控...

  • 第十章异常

    目录 仅在发生异常的条件下使用异常 对可恢复条件使用已检查异常,对编程错误使用运行时异常 避免不必要地使用检查异常...

  • java 异常

    异常分类 java中常见的运行时异常 NullPointerException - 空指针引用异常 ClassCa...

  • 经验总结(四):java常用类库

    Java常用类库 一:异常和错误分类 运行时异常: NullPointerException - 空指针引用异常 ...

  • 04. NULL检查机制

    Kotlin 空安全检查机制,有多种处理方式。可以使用 !! 符号,抛出异常可以使用 ? 认可NULL对 NULL...

网友评论

    本文标题:使用dynamic引发的异常:无法对 null 引用执行运行时绑

    本文链接:https://www.haomeiwen.com/subject/klxfextx.html