Exception.Data 为异常添加更多调试信息
2024-08-27 16:21:48
我们抛出异常是为了知道程序中目前的状态发生了错误。为了能够知道错误的详细信息便于我们将来避免产生这样的错误,我们会选用合适的异常类型,在异常中编写易于理解的 message 信息。但是有时我们需要更多的信息进行调试才能帮忙在将来避免这个异常。
System.Exception
类中就自带了这样的属性 Data
,它是 IDictionary
类型的:
public virtual IDictionary Data {
[System.Security.SecuritySafeCritical] // auto-generated
get {
if (_data == null)
if (IsImmutableAgileException(this))
_data = new EmptyReadOnlyDictionaryInternal();
else
_data = new ListDictionaryInternal();
return _data;
}
}
别问我为什么把括号放最右边,那是微软自己写的源码 点击这里查看
最近在调试 .Net Framework 内部代码的异常时就发现微软就是使用这个属性储存异常的更多细节的:
internal void RegisterStylusDeviceCore(StylusDevice stylusDevice)
{
lock (__stylusDeviceLock)
{
int stylusDeviceId = stylusDevice.Id;
// The map must contain unique entries for each stylus device.
if (__stylusDeviceMap.ContainsKey(stylusDeviceId))
{
InvalidOperationException ioe = new InvalidOperationException();
// We add a tag here so we can check for this specific exception
// in TabletCollection when adding new tablet devices.
ioe.Data.Add("System.Windows.Input.StylusLogic", "");
throw(ioe);
}
__stylusDeviceMap[stylusDeviceId] = stylusDevice;
}
}
以上代码出自 .Net Framework 4.6 的 System.Windows.Input.StylusLogic
类型,http://referencesource.microsoft.com 里 .Net Framework 4.7 中找不到。
需要注意的是,Exception
的 ToString()
方法并不会把这个字典转成字符串的任意一个部分;所以,如果需要在日志中记录程序中全局捕获的异常,需要自己去遍历异常中的 Data
的每一项。不过,为了解决掉更多的程序错误,我们记录日志的时候不已经写了更多的信息(比如 InnerException
)了吗?
最新文章
- Python 黑帽编程大纲(变化中)
- android_demo之自动生成动态表格
- 【瞎想】TDD与汉字;FDD与英语字母
- Linux启动过程
- Ajax基础--JavaScript实现
- [Angular 2] Interpolation: check object exists
- C#主要字典集合性能对比[转]
- JSTL解析——002——core标签库01
- 浅谈Java的集合框架
- VMware Workstation 12 Pro 之安装XP系统
- Centos中hive/hbase/hadoop/mysql实际操作及问题总结
- (转载) python3: beautifulsoup的使用
- Linux 依据关键字查找正在运行的进程
- C风格字符串和C++string对象的相互转化
- WOW
- Spring Cloud(四) --- config
- Vue+Flask看这篇就够了
- electron快速开始
- 基于Packet Tracer 组建智能公司局域网
- ANR机制
热门文章
- byte字节数组的压缩
- [Vue]Vue语法糖v-bind、v-on
- 已经安装了node和npm,输入node -v 未找到命令
- 打开Eclipse提示“The default workspace “xxxx” is in use or cannot be created Please choose a different one“
- IOS-UISearchBar
- yum search 不好用时
- [C#]ref,out关键字的作用
- lvs fullnat部署手册(一)fullnat内核编译篇
- 2: 使用Prism初始化程序 Initializing Applications Using the Prism Library 5.0 for WPF(英汉对照版)
- LeetCode OJ:Min Stack(最小栈问题)