【问题标题】:auto generated catch in visual studio 2010Visual Studio 2010 中自动生成的捕获
【发布时间】:2012-05-04 17:38:28
【问题描述】:

在 vs 2010 或第三方应用程序中,有什么方法可以针对所有可能的异常自动生成方法可以抛出的“catch”?

例如,如果我使用“Directory.CreateDirectory”,它将自动创建:

try
{
 Directory.CreateDirectory("blabla");
}
catch (PathTooLongException)
{}
catch (DirectoryNotFoundException)
{}
catch (IOException)
{}
catch (ArgumentNullException)
{}
catch (UnauthorizedAccessException)
{}

【问题讨论】:

标签: c# visual-studio-2010 try-catch code-snippets


【解决方案1】:

有一个工具可以在您的代码中找到未处理的异常:Exception Hunter by Red Gate software。

事实证明,他们停止了它:

随着 .NET 4.0 和 WPF 的发布,CLR 可以抛出的异常数量大大增加,达到了压倒性的地步。排除列表不再涵盖 CLR 可能抛出的所有不太可能的异常。这意味着,尽管 Exception Hunter 会提供准确的结果,但这些结果将包含一长串潜在异常,其中大部分无需担心。

这应该表明“捕获方法可以抛出的所有异常”可能是一个坏主意。通常的模式是全局包罗万象

try {
    ...
} catch (Exception ex) {
    logAndShowErrorMessage(ex);
}

仅在用户界面 (WinForms) 的 top 级别,或在专用方法中处理错误(WPF:Application.DispatcherUnhandledException,WebForms:Application.Error)。

只有在您预计会发生此异常并且您知道如何具体处理此异常以及如何继续的异常情况下,您才可以直接在代码中处理异常之后执行您的程序。


附带说明:您想要的看起来与名为“已检查异常”的 Java 功能非常相似:它强制您处理异常或声明您的方法将重新抛出它。下面的问题解释了为什么 C# 的设计者故意选择不来包含这个特性:

【讨论】:

    【解决方案2】:

    默默地忽略异常是非常糟糕的做法,因此,当然,没有办法使用空主体自动生成捕获。此外,该方法可以抛出哪些异常也是未知的,因为在 C# 中,没有声明函数可能抛出哪些异常(与 Java 不同)。

    如果你仍然想忽略所有的异常,你可以写catch(Exception),它会捕获所有的异常,因为所有的异常都继承自基类Exception。但是你确定默默地忽略可能发生的一切是个好主意吗?最好让用户(或调用者)知道出了问题,而不是默默地不做预期的工作(例如,如果Directory.CreateDirectory 会以这种方式行事,那么您永远不知道它是否成功创建目录与否,如果不是,是什么原因。

    【讨论】:

    • OP 并没有说他们想忽略所有异常,只是他们想为每个异常生成一个 catch 块,而没有所有异常的列表。然后他们可以将任何东西放入 catch 块中。
    猜你喜欢
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多