3

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

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

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

2 回答 2

1

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

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

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

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

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

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

仅在您希望发生此异常并且您知道如何专门处理此异常以及之后如何继续执行程序的异常情况下,您才直接在代码中处理异常。


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

于 2012-04-24T05:11:49.790 回答
0

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

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

于 2012-04-24T04:56:27.730 回答