在C#中查找方法可能抛出的异常

58

有没有办法找出.NET代码中任何方法可能引发的异常?理想情况下,我想看到可能抛出的异常并选择我想要处理哪些。我猜我想要Java中throws子句提供的信息。

现在的情况是,我正在对来自网络的XML文档进行Linq查询,并希望知道可能会发生什么问题。我可以打开反编译工具Reflector查看,但我认为可能还有更简单的方法。

4个回答

44

.NET没有像Java那样强制实施(“checked”)异常。如果开发人员添加了///<exception.../>块,则智能感知可能会显示此信息,但是最终可能会发生比您预期更多的异常(例如OutOfMemoryExceptionThreadAbortExceptionTypeLoadException等),而且发生的时间也很难预测。

通常情况下,您应该有一个关于哪些事情可能出错以及哪些错误可以实际处理的想法。在大多数情况下,正确的行为是让异常上升到调用堆栈(只运行任何“finally”代码以释放资源)。

Eric Lippert在这里对此问题进行了良好的博客介绍。


1
谢谢。Eric Lippert博客的链接也非常有帮助。 :) - Helephant
2
链接到文章已经失效,当前可用的链接为:https://learn.microsoft.com/en-us/archive/blogs/ericlippert/vexing-exceptions - Remco Ros
1
@RemcoRos 我已更新帖子中的链接,谢谢! - Nomnom

8

我认为异常猎手可以提供这些信息,但需要付费...


2
此软件已经停止开发/被废弃。 - froeschli
5
这与Exception Hunter无法相提并论,但如果你正在寻找一种免费的方法来完成这个任务,我在这里写了一个快速获取此信息的方法-https://github.com/stevesheldon/ExceptionReflector。如果不符合您的需求,请随意fork/update。 - Steve Sheldon

3

在 StackOverflow 上阅读了另一篇关于这个问题的文章后,我在那篇答案的基础上构建了一个工具来解决这个问题。你可以从这里的 GitHub 获取源代码:

Exception Reflector

你还可以在这里阅读更多信息:

http://steves-rv-travels.com/archives/167


我在调用System.Net.Http的库上尝试了这个方法,但是我没有在列表中看到那些异常。这是因为它是异步调用并且包装在AggregateException中吗?我还使用了.NET 4.5,也许这就是罪魁祸首。 - aoetalks

0
只要您使用BCL类,它们都有完整的文档,因此Intellisense会显示方法可能引发的任何异常。除此之外(和阅读文档),我认为没有其他方法了。

1
有许多未记录的异常情况,因为它们无法预测;即使如此,您也不能完全信任智能感知工具的更新。顺便说一下,这个踩踏并不是我干的。 - Marc Gravell
1
像您提到的TypeLoadException这样的“许多异常”可能来自CLR本身,从技术上讲,甚至可能来自CPU。我认为没有人有兴趣预测和捕获这些异常。另一方面,.NET SDK列出了可以由BCL方法抛出的异常... - liggett78
1
这些通常是你真正感兴趣的内容。 - liggett78

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接