【发布时间】:2010-10-27 13:45:59
【问题描述】:
当您尝试访问不在字典中的键(例如)时,您会得到以下堆栈跟踪:
at System.ThrowHelper.ThrowKeyNotFoundException()
at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
.... .... (my own code stack trace)
像大多数人一样,我会在错误发生时记录这些错误,并尝试找出发生了什么。
我想要的两个关键信息是这发生在哪里(堆栈跟踪对此非常有帮助),以及导致异常的关键,它没有出现在任何地方。
要么我看的不正确(KeyNotFoundException 类包含一个“Data”成员,该成员始终为空,并且“Message”字段不包含键值),或者它没有包含在框架。
我无法想象 .net BCL 团队中没有人认为这将是一个有用的功能。我很想知道他们为什么不包括它。有什么好的理由不这样做吗?
您如何处理这些异常?我能想到的唯一选择是在 Dictionary 上使用自定义扩展方法,该方法将包装调用,捕获异常,并使用有关密钥的其他信息重新抛出它,但这对我不拥有的代码没有帮助,更改这样的“基本”功能感觉很糟糕。
你怎么看?
我知道this question,关于人们无法访问引发异常的方法的参数这一一般事实。我的问题特别与 KeyNotFoundException 有关。
编辑:我知道 TryGetValue 模式,当我希望我的集合可能不包含密钥时,我一直这样做。但是当它应该包含它时,我不测试,因为我更喜欢我的程序因异常而失败,以便我知道发生了一些意想不到的事情之前(即在应该插入密钥的时候)
我可以在我所有的字典访问中包装一个 try/catch/log 错误/重新抛出,但这会导致难以阅读的代码,并与我所有的异常处理/记录的东西混在一起。
【问题讨论】:
标签: c# .net debugging exception dictionary