zoukankan      html  css  js  c++  java
  • 使用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的原因并及时修复。

  • 相关阅读:
    Nginx有哪些作用?
    MYSQL如何优化?
    jdk1.8新特性
    [javase基础] JDK JRE JVM的区别?
    JDBC中如何进行事务处理?
    JDBC、ibatis(mybatis)、Hibernate有什么不同?
    java面试题最容易犯错
    Spring高频率面试题
    python pip whl安装和使用
    深入理解 Linux的进程,线程,PID,LWP,TID,TGID
  • 原文地址:https://www.cnblogs.com/buguge/p/7574146.html
Copyright © 2011-2022 走看看