我怎么知道我是不是没有处理我的 .NET 代码可能抛出的一些未经检查的异常?
Posted
技术标签:
【中文标题】我怎么知道我是不是没有处理我的 .NET 代码可能抛出的一些未经检查的异常?【英文标题】:How would I know if I haven't handled some unchecked exceptions that my .NET code could throw?我怎么知道我是否没有处理我的 .NET 代码可能抛出的一些未经检查的异常? 【发布时间】:2011-01-13 09:38:50 【问题描述】:在 .NET 中,方法签名不会告诉我我是否错过了处理一些可能由我的代码引发的异常。 如果说我正在使用 HashTable 删除但没有处理 ArgumentNullException,是否有一些工具可以警告我?我不想在运行时感到惊讶。
这是否意味着您需要非常了解您的代码,否则未经检查的异常可能更难处理?
【问题讨论】:
【参考方案1】:实际上,通过终止程序来处理意外异常是处理这种情况的最佳方法,因为通常情况下,当发生意外情况时,程序状态是未定义的。如果你记录了所有的异常,并且有一套不错的验收测试,你就可以消除由于程序流程导致的意外异常而产生的问题。
通过检查方法输入、类的单元测试和了解您的框架来进行防御性编程将使大多数异常发生。
【讨论】:
【参考方案2】:对于 Windows 应用程序:
AppDomain currentDomain = default(AppDomain);
currentDomain = AppDomain.CurrentDomain;
// Handler for unhandled exceptions.
currentDomain.UnhandledException += UnhandledExceptionHandler;
// Handler for exceptions in threads behind forms.
Application.ThreadException += ThreadExceptionHandler;
public static void UnhandledExceptionHandler(object sender, UnhandledExceptionEventArgs e)
public static void ThreadExceptionHandler(object sender, Threading.ThreadExceptionEventArgs e)
【讨论】:
@Aseem:不确定我是否理解这一点。所以,如果我没有处理它们,所有未处理的和线程相关的异常都会出现在这里,它提供了一些安全性。这是你的意图吗? 是的...然后您可以决定如何处理这些异常。【参考方案3】:对于您要完成的工作没有语言支持。我们为 VS 编写了一个自定义插件,以确保我们 API 的所有入口点都有用于记录的尝试捕获。然而,我从来没有看到强制你覆盖所有可能声明的异常情况的语言的价值,因为你仍然需要编写一些代码来对错误做一些有意义的事情。大多数人只是查看编译器抱怨编写处理程序并在一些无用代码中隐藏可能有用的错误。在某些情况下,最好是失败并知道存在问题。
【讨论】:
我同意只捕获异常而不正确使用它来决定程序应该如何应对它是不好的。就像在 VB6 中只说On Error Resume Next
.【参考方案4】:
您应该为您的应用程序添加***别的异常处理程序,并为您的应用程序编写单元、功能和集成测试,这将测试所有可能的用例。这将帮助您消除几乎所有未经检查的异常。
也尽量不要捕获异常,而是排除原因。 (即不抓住ArgumentNullException
,但不通过null
【讨论】:
以上是关于我怎么知道我是不是没有处理我的 .NET 代码可能抛出的一些未经检查的异常?的主要内容,如果未能解决你的问题,请参考以下文章