使用try catch时如何知道可能出现的异常?

5
根据MSDN,捕获异常时不指定具体类型,例如使用System.Net.Exception是一个不好的做法。
每次捕获错误时我是否需要查阅msdn手册以查看可能的异常类型?或者在IDE中是否有任何方式可以让我快速查看?
目前我正在使用Visual Studio 2013 Express Edition。
 try
 {
    using (WebClient goog = new WebClient()) 
    {
       goog.DownloadString("http://google.com");
    } 
 }
 catch(Exception E)
 {
    saveLog("methodname", E.Message);
 }

编辑:这个链接中,看起来VS已经有一个显示异常的选项,然而,当我选择一个方法时,它只显示方法的类型和参数,但它不显示异常。


3
如果你在方法上悬停鼠标,智能感知会告诉你可能出现的异常情况。 - Jonesopolis
1
也许我有点懒,或者对VS不是很熟悉,但通常我只是等待表达式被抛出,然后从错误中复制它并放入我的try catch中。 - Wobbles
我该如何启用智能感知?当我将鼠标悬停在一个方法上时,我只能看到方法类型、名称和可能的参数。 - Rafik Bari
1
只有在方法声明之前存在相关的xml标签时,智能感知才会显示可能的异常,显然,并非BCL的每个方法都具有此标记。 - ale
@Jonesy,只有当一个方法具有XML注释并且异常标签已经被填写时,它才会告诉你。没有什么强制开发人员使用这些的,因此它们经常会丢失。 - Falanwe
旁注:你的 saveLog 真是糟糕透了。绝不能只保存异常的消息;大多数情况下,消息几乎毫无价值。如果以这种方式记录异常,请调用 ToString() 并保存 该结果。如果你在这里的代码示例中只是简写为“对异常进行某些操作”,那么请忽略此信息。 - user1228
3个回答

2
与Java不同,C#不需要在方法签名中列出可能的异常。这有一些好处和一些坏处。你刚遇到了其中一个坏处。
除非: - 你调用的方法已经很好地记录了潜在的异常(最好的情况); - 你知道具体的错误情况,运行它们并查看它们创建了什么异常(糟糕的情况); - 你不知道会发生什么,记录所有东西,并根据每次发生意外事件修改你的catch语句(最糟糕的情况)。

2

通常最佳实践是仅添加您期望在程序运行时发生的异常处理。

例如,如果您正在处理文件,则处理***NotFoundException类型是有意义的。适当的编码将确保不会发生像ArgumentNullException这样的问题,因此不需要处理等等。


这回答了如何处理异常,而不是如何知道可能会抛出哪些异常。 - David S.
@DavidS。事实上,你大多数时候不需要知道(并且并非所有库都有适当/完整的文档,因此获得全面的列表是一场空想)。因此,你编写的代码确保你使用的函数传递正确的参数,让你只需处理实际的异常情况,就像我上面解释的那样。 - Tom Lint

0

没有内置的功能可以自动显示这个,但是你可以把插入符号放在方法名的某个位置,然后按下CTRLSpace。这里显示的信息将与您链接中的信息相同,因此应该会显示DownloadString方法的两个异常。

悬停在DownloadString上不一定会显示与单击方法名并按下CTRLSpace相同的信息(后者会显示方法抛出的异常)。


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