Exception.Data 为异常添加更多调试信息

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

转载于:https://www.cnblogs.com/walterlv/p/10326597.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值