我们抛出异常是为了知道程序中目前的状态发生了错误。为了能够知道错误的详细信息便于我们将来避免产生这样的错误,我们会选用合适的异常类型,在异常中编写易于理解的 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 中找不到。

需要注意的是,ExceptionToString() 方法并不会把这个字典转成字符串的任意一个部分;所以,如果需要在日志中记录程序中全局捕获的异常,需要自己去遍历异常中的 Data 的每一项。不过,为了解决掉更多的程序错误,我们记录日志的时候不已经写了更多的信息(比如 InnerException)了吗?

最新文章

  1. Python 黑帽编程大纲(变化中)
  2. android_demo之自动生成动态表格
  3. 【瞎想】TDD与汉字;FDD与英语字母
  4. Linux启动过程
  5. Ajax基础--JavaScript实现
  6. [Angular 2] Interpolation: check object exists
  7. C#主要字典集合性能对比[转]
  8. JSTL解析——002——core标签库01
  9. 浅谈Java的集合框架
  10. VMware Workstation 12 Pro 之安装XP系统
  11. Centos中hive/hbase/hadoop/mysql实际操作及问题总结
  12. (转载) python3: beautifulsoup的使用
  13. Linux 依据关键字查找正在运行的进程
  14. C风格字符串和C++string对象的相互转化
  15. WOW
  16. Spring Cloud(四) --- config
  17. Vue+Flask看这篇就够了
  18. electron快速开始
  19. 基于Packet Tracer 组建智能公司局域网
  20. ANR机制

热门文章

  1. byte字节数组的压缩
  2. [Vue]Vue语法糖v-bind、v-on
  3. 已经安装了node和npm,输入node -v 未找到命令
  4. 打开Eclipse提示“The default workspace “xxxx” is in use or cannot be created Please choose a different one“
  5. IOS-UISearchBar
  6. yum search 不好用时
  7. [C#]ref,out关键字的作用
  8. lvs fullnat部署手册(一)fullnat内核编译篇
  9. 2: 使用Prism初始化程序 Initializing Applications Using the Prism Library 5.0 for WPF(英汉对照版)
  10. LeetCode OJ:Min Stack(最小栈问题)