使用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()
接下来看程序代码:
try
{
//查找distinct后的“商户&日期”
var map = orderDal.GetMerchantsForSettlement(_frDate, _toDate);
if (map == null)
{
_logHelper.WriteLog("no records");
return;
}
_logHelper.WriteLog("获取到{0}条“商户&日期”对儿", map.Count);
int i = ;
//遍历“商户&日期”集合,逐一查询出来订单然后生成文件
foreach (var p in map)
{
i++;
_logHelper.WriteLog("[{2}] 商户:{0}-文件日期:{1}", p.MerCode, p.Date.ToShortDateString(), i);
try
{
var isOK = Generate(p.MerCode, p.Date);
_logHelper.WriteLog("[{0}]生成文件返回{1}", i, isOK);
}
catch (Exception ex)
{
if (ex is ResponseErrorException)
{
_logHelper.WriteLog("[{0}]{1}", i, ex.Message);
}
else
{
_logHelper.WriteLog("[{0}]文件生成异常 {1}", i, ex.ToString());
}
}
}
}
catch (Exception ex)
{
_logHelper.WriteLog("跑批异常 {0}", ex.ToString());
}
39
_logHelper.WriteLog("本次批量生成账单文件结束.");
}
其中,GetMerchantsForSettlement方法的返回值是一个List<dynamic>
分析可知,异常一定是在第16行抛出的。
进一步分析,自然是调用p.Date的.ToShortDateString()方法出现这个异常了,也就是说这个集合里存在Date为null的项。
通过连接生产读库执行测试用例,验证了这一点。这个List<dynamic>里,果然有Date是空值的记录。Date来自于db里支付单记录表的支付时间,有一个商户的已支付完成的支付单的支付时间是null,从系统业务逻辑的角度来说,支付完成的订单一定要有支付时间的,否则会导致账单数据错误。
接下来,联系运维,执行update来修复这条记录的支付时间,然后重新跑账单,问题得以解决。当然,负责支付的伙伴得查查支付时间是null的原因并及时修复。
使用dynamic引发的异常:无法对 null 引用执行运行时绑定的更多相关文章
- Effective Java 第三版——70. 对可恢复条件使用检查异常,对编程错误使用运行时异常
Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...
- java--何时处理Exception(哪一个层级),包装的基础类处理任务尽可能简洁,写入日志,检查null等运行时异常
1. 运行时异常和受检异常 2. 提前预防运行时异常.最常发生的是NPE,而检查NPE是程序员的基本职责.其他的,如除0等运行时异常的检查,需要程序员仔细检查,每个函数都得检查(除非可以确定不会有空指 ...
- java 检查抛出的异常是否是要捕获的检查性异常或运行时异常或错误
/** * Return whether the given throwable is a checked exception: * that is, neither a RuntimeExcepti ...
- Java中运行时异常和非运行时异常什么鬼?
Java中的异常分类 RuntimeException(也称unchecked exceptions,运行时异常) 就是我们在开发中测试功能时程序终止,控制台出现的异常.(一般来说,出现运行时异常基本 ...
- Exception、Error、运行时异常与一般异常有何异同
转自博客 https://blog.csdn.net/m0_37531231/article/details/79502778 一.开场白 对于程序运行过程中的可能出现异常情况,java语言使用一种 ...
- Java运行时异常和非运行时异常
1.Java异常机制 Java把异常当做对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类.Java中的异常分为两大类:错误Error和异常Exception,Java ...
- Java运行时异常与一般异常以及错误的异同
Java提供了两类主要的异常:runtime exception和checked exception.checked 异常也就是我们经常遇到的IO异常,以及SQL异常都是这种异常.对于这种异常,JAV ...
- Java中Error和Exception的异同以及运行时异常(Runtime exception)与检查型异常(checked exception)的区别
一:Error和Exception的基本概念: 首先Exception和Error都是继承于Throwable 类,在 Java 中只有 Throwable 类型的实例才可以被抛出(throw)或者捕 ...
- 运行时异常&编译时异常
/* 异常体系: --------| Throwable 所有错误或者异常的父类 --------------| Error(错误) --------------| Exception(异常) 异常一 ...
随机推荐
- 计蒜客 31436 - 提高水平 - [状压DP]
题目链接:https://nanti.jisuanke.com/t/31436 作为一名车手,为了提高自身的姿势水平,平时的练习是必不可少的.小 J 每天的训练包含 $N$ 个训练项目,他会按照某个顺 ...
- POJ 2027 - No Brainer
Description Zombies love to eat brains. Yum. Input The first line contains a single integer n indica ...
- php之运算符
运算符优先级相同,运算符的结合方向决定了该如何运算, 一.运算符优先级 组合方向 运算符 附加信息 无 clone new clone和new 左 [ array 右 ** 算术运算符 右 ++ -- ...
- 2017年蓝桥杯省赛A组c++第7题(正则问题)
/* 描述:正则问题 考虑一种简单的正则表达式: 只由 x ( ) | 组成的正则表达式. 小明想求出这个正则表达式能接受的最长字符串的长度. 例如 ((xx|xxx)x|(x|xx))xx 能接受的 ...
- 2015年蓝桥杯省赛A组c++第4题
/* StringInGrid函数会在一个指定大小的格子中打印指定的字符串. 要求字符串在水平.垂直两个方向上都居中. 如果字符串太长,就截断. 如果不能恰好居中,可以稍稍偏左或者偏上一点. 下面的程 ...
- Chap4:探究操作系统[The Linux Command Line]
1 learn some more commands: (1) ls-List directory contents (2) file -Determine file type (3) less-Vi ...
- DbGridEh 一个单元格的值改变时另一单元格的值随之改变
你可以为每个字段设置OnSetText事件,这样在输入完后回车会移动时就会触发,或者在adoquery的beforepost中或afterpost中都可以grid也提供了一些事件,也可以在某些条件下做 ...
- Servlet基本介绍和使用
基本概念 Servlet又称为Java Servlet是一个基于java技术的web组件,运行在服务器端,用于生成动态的内容.Servlet是平台独立的java类,编写一个Servlet实际上就是按照 ...
- 那些年读过的书《Java并发编程实战》二、如何设计线程安全类
1.设计线程安全类的过程 设计线程安全类的过程就是设计对象状态并发访问下线程间的协同机制(在不破坏对象状态变量的不变性条件的前提下). (1)构建线程安全类的三个基本要素: 1)找出构成对象状态的所有 ...
- SRWebSocket
以前有个项目里有做聊天室,就是用的SRWebSocket.现在整理下资料,主要是对网上搜索到的资料进行整合. WebSocket介绍,与Socket的区别 https://blog.csdn.net/ ...