C# 为方法引发的所有异常生成代码

C# 为方法引发的所有异常生成代码,c#,.net,visual-studio,visual-studio-2012,exception-handling,C#,.net,Visual Studio,Visual Studio 2012,Exception Handling,您知道是否有任何选项或扩展可以生成捕获VisualStudio中方法引发的所有异常所需的代码 例如,我正在调用File.writealBytes(…) 该方法可以抛出9个异常:System.ArgumentException、System.ArgumentNullException等 我想要所有9个例外的代码: catch (ArgumentException) { } catch (ArgumentNullException) { } ... 我在Eclipse for Java中见过这

您知道是否有任何选项或扩展可以生成捕获VisualStudio中方法引发的所有异常所需的代码

例如,我正在调用
File.writealBytes(…)

该方法可以抛出9个异常:System.ArgumentException、System.ArgumentNullException等

我想要所有9个例外的代码:

catch (ArgumentException) {

}
catch (ArgumentNullException) {

}
...
我在Eclipse for Java中见过这种行为,但我想知道Visual Studio中是否有类似的行为

顺便说一句,我使用的Visual Studio 2012 Premium不是Java。您不仅不需要捕获一个方法引发的所有异常,这也是一个非常糟糕的想法


您应该只捕获需要处理的异常。如果对于一个特定的异常,您没有什么特别需要做的,那么让它向您的调用者冒泡,调用者可能需要做一些事情。也可能不是。

在VisualStudio中没有类似的东西

主要问题是,与Java不同,C#不支持类似于
throws
子句的任何东西。因此,无法直接知道方法将引发哪些可能的异常。该工具是围绕C#中不存在的语言特性构建的

安德斯·海尔斯伯格


也就是说,在C#中,通常不希望显式捕获所有这些异常。您应该只捕获可以正确处理的异常。如果您想捕获所有用于记录puroses的异常,只需在任何特定异常类型之后使用单个
捕获(异常e)
,它将捕获所有其他异常。

您不应该捕获ArgumentException或ArgumentNullException,因为它们是。你应该编写你的代码,这样它们就不会被抛出。你需要单独处理它们吗?否则,
catch(Exception)
。类似:您必须拥有非常成熟的用户,他们将知道如何处理
ArgumentNullException
,而不是
ArgumentException
。正如托马斯暗示的那样,这些应该被更早地捕捉到,并给出有意义的反馈。我认为他并不担心是否应该捕捉到所有的异常。他似乎只是想知道VS2012中是否有一个快捷方式,自动生成
try{}catch{}
块,这似乎已经得到了回答我知道C#不是Java,但是如果我想根据抛出的异常向用户提供不同的反馈,该怎么办?我知道我可以捕获(Exception ex)并提供默认消息,无论发生什么情况,或者获取ex.消息并将其显示给用户,但有时这些消息对用户不是很友好。您的用户几乎肯定不需要知道这一级别的详细信息。问问自己,如果你告诉你的用户有一个
ArgumentException
,你会怎么做!事实上,只有程序员才能真正解决这个异常。对于你向用户报告的每一个异常情况,问问自己用户应该怎么做。正如我在之前的评论中提到的,这些只是几个示例,我想我为这个问题选择了错误的示例。在我的问题中,我谈论的是代码生成,而不是需要捕获或不捕获哪些异常。正如我也提到过的,关于异常,比如:PathTooLongException?或者DirectoryNotFoundException?还是未经授权的访问例外?用户需要对这些异常采取一些措施。来自这些异常的正常消息可能不会有问题。Microsoft可能考虑过用户处理
PathTooLongException
。该异常的正常消息属性有什么问题吗?它们没有什么问题,只是有时候它们对用户不是很友好,对于其中一些,我喜欢向用户提供一些具体的反馈,说明如何纠正该问题。感谢您的回答。我阅读了采访,现在我明白了为什么我从来没有看到过一些东西类似的。我想我需要手动编写我想要处理的所有异常。如果您想使用
catch(Exception e)
同时捕获所有异常,只需添加到@ReedCopsey的答案中,但对其中一些异常执行一些有意义的操作,您可以在if语句中使用
is
操作符,即
if(e是PathToolLongException)