使用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(异常) 异常一 ...
随机推荐
- [No0000172]Android Studio设置HTTP代理(可用)
android SDK下载:http://www.androiddevtools.cn . 禁止第一次启动 到AS安装目录,打开bin目录,编辑idea.properties, 在文件末尾添加: di ...
- [No0000A5]批处理常用命令大全&&21个DOS常用命令
1.Echo 命令打开回显或关闭请求回显功能,或显示消息.如果没有任何参数,echo 命令将显示当前回显设置.语法echo [{on|off}] [message]Sample: echo off e ...
- pytorch的一些基本操作
(1)生成一个未初始化的tensor import torch x = torch.Tensor(5,3) print(x) (2)随机初始化一个tensor y = torch.randn(5,3) ...
- iOS开发ffmpeg SDK 编译和集成
FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.它提供了录制.转换以及流化音视频的完整解决方案.同时,FFmpeg是一套跨平台的方案,所以我们可以在iOS开发中使 ...
- [knowledge][DPI] kernel bypass 高性能网络包处理的宏观思路
高性能网络包处理,这个问题的出现,主要原因在于linux内核协议栈的处理能力,已经跟不上日益增长的网卡吞吐量以及数据量. 有关详细的内核协议栈瓶颈的阐述,可以参考如下这篇文章: <Improvi ...
- c++中new的三种用法详细解析
转载至: http://www.jb51.net/article/41524.htm 以下的是对c++中new的三种使用方法进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助. 一. ...
- mybatis获取批量插入的主键自增id
一.写一个实体类 public class UserInfo { private long userId; private String userAccount; private String use ...
- 洛谷P4823 拯救小矮人 [TJOI2013] 贪心+dp
正解:贪心+dp 解题报告: 传送门! 我以前好像碰到过这题的说,,,有可能是做过类似的题qwq? 首先考虑这种显然是dp?就f[i][j]:决策到了地i个人,跑了j个的最大高度,不断更新j的上限就得 ...
- swift一些常用系统方法的简化使用
//获取Image func FImage(_ imageName:String) -> UIImage { return UIImage(named:imageName)! } //获取Url ...
- nodejs 学习三 异步和同步
同步函数 for (let i = 0; i < 10; i ++) { setTimeout(() => { console.log(`${i} ______ ${new Date}`) ...