使用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的原因并及时修复。

时间: 2024-10-10 18:31:41

使用dynamic引发的异常:无法对 null 引用执行运行时绑定的相关文章

解决ASP.NET MVC5&quot;无法对 null 引用执行运行时绑定&quot;

无法对 null 引用执行运行时绑定 说明: 执行当前 Web 请求期间,出现未经处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息. 异常详细信息: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 无法对 null 引用执行运行时绑定源错误: 视图,Demo.csthml: @model LanhuImageUploader.Web.Models.Product @{ ViewBag.Title =

第五十八条:对可恢复的情况使用受检异常,对编程错误使用运行时异常

Java程序设计语言提供了三种可抛出结构(throwable):受检的异常(checked exception),运行时异常(run-time exception)和错误(error). 关于什么时候适合使用哪种可抛出结构,程序员中存在一些困惑.虽然这项决定并不总是那么清晰,但是还是有一般性的原则提出了强有力的指导. 在决定使用受检的异常或者未受检的异常时,主要的原则是:如果期望调用者能够适当地恢复,对于这种情况就应该使用受检的异常.通过抛出受检的 异常,强迫调用者在一个catch子句中处理该异

java 检查抛出的异常是否是要捕获的检查性异常或运行时异常或错误

/** * Return whether the given throwable is a checked exception: * that is, neither a RuntimeException nor an Error. * @param ex the throwable to check * @return whether the throwable is a checked exception * @see java.lang.Exception * @see java.lang

Java运行时异常和非运行时异常

1.Java异常机制 Java把异常当做对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类.Java中的异常分为两大类:错误Error和异常Exception,Java异常体系结构如下图所示: 图片来源:http://blog.csdn.net/wuwenxiang91322/article/details/10346337 2.Throwable Throwable类是所有异常或错误的超类,它有两个子类:Error和Exception,分别表示错误和异常.其中异

运行时异常和checked异常

运行时异常在运行期间才能被检查出来,一般运行期异常不需要处理.Checked异常在编译时就能确定,Checked异常需要自己处理. checked 异常也就是我们经常遇到的IO异常,以及SQL异常都是这种异常.对于这种异常,JAVA编译器强制要求我们必需对出现的这些异常进行catch.所以,面对这种异常不管我们是否愿意,只能自己去写一大堆catch块去处理可能的异常. runtime exception,也称运行时异常,我们可以不处理.当出现这样的异常时,总是由虚拟机接管.比如:我们从来没有人去

运行时异常与受检异常有何异同?

异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误,只要程序设计得没有问题通常就不会发生.受检异常跟程序运行的上下文环境有关,即使程序设计无误,仍然可能因使用的问题而引发.Java编译器要求方法必须声明抛出可能发生的受检异常,但是并不要求必须声明抛出未被捕获的运行时异常.异常和继承一样,是面向对象程序设计中经常被滥用的东西,在Effective Java中对异常的使用给出了以下指导原则: - 不要将异常处理用于正常的控制流(设计良好的A

Exception、Error、运行时异常与一般异常有何异同

转自博客  https://blog.csdn.net/m0_37531231/article/details/79502778 一.开场白 对于程序运行过程中的可能出现异常情况,java语言使用一种称为异常处理的错误捕捉机制进行处理.相信大家对 try { }catch( ){} finally{} 这种结构非常熟悉,使用频率极高.既然经常使用它,而且也是面试常问知识点,我们就有必要去深入地了解一下.也谈不上深入,只是java语言的基本功.下面,开始吧! 二.异常分类 在java中,异常对象都

java中的一般异常与运行时异常

Java提供了两类主要的异常:runtime exception和checked exception.checked 异常也就是我们经常遇到的IO异常,以及SQL异常都是这种异常.对于这种异常,JAVA编译器强制要求我们必需对出现的这些异常进行catch.所以,面对这种异常不管我们是否愿意,只能自己去写一大堆catch块去处理可能的异常. 但是另外一种异常:runtime exception,也称运行时异常,我们可以不处理.当出现这样的异常时,总是由虚拟机接管.比如:我们从来没有人去处理过Nul

【搜狗问问】运行时异常与一般异常有何异同?

Java提供了两类主要的异常:runtime exception和checked exception.checked 异常也就是我们经常遇到的IO异常,以及SQL异常都是这种异常.对于这种异常,JAVA编译器强制要求我们必需对出现的这些异常进行catch.所以,面对这种异常不管我们是否愿意,只能自己去写一大堆catch块去处理可能的异常. 但是另外一种异常:runtime exception,也称运行时异常,我们可以不处理.当出现这样的异常时,总是由虚拟机接管.比如:我们从来没有人去处理过Nul