【问题标题】:Is there a way to determine gaps in try/catch coverage?有没有办法确定 try/catch 覆盖率的差距?
【发布时间】:2010-03-16 15:47:03
【问题描述】:

我正在调试一项在启动时遇到问题的服务。为了帮助我,我将几乎所有内容都包装在一个 try/catch 块中,并将所有错误写入文件。我不想把它们放在每个方法中,我只想把它们放在最高级别的方法中,以便它们从其他方法中捕获异常。

不过,由于服务在某些情况下确实会停止,因此有些事情正在发生。除了目测之外,有没有其他方法可以确定我的 try/catch 覆盖范围的差距在哪里?

【问题讨论】:

  • 这是本机代码还是托管代码? C# 还是 C++?

标签: c# windows-services exception


【解决方案1】:

您可以像这样捕获 AppDomain 级别的异常:

AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

void CurrentDomain_UnhandledException(Object sender, UnhandledExceptionEventArgs e)
{

    //Object exception = e.ExceptionObject;
    //Boolean terminating = e.IsTerminating;
}

您可以查看link 了解更多示例。

【讨论】:

  • 特别是如果应用程序是用原生 c++ 编写的 ;)
  • 我试过这样做,但我认为它没有遇到异常。我在服务的 OnStart 方法的第一行订阅了事件,在处理程序方法中,我调用了我的日志记录方法,如下所示: Utility.LogError(e.ExceptionObject as Exception);但是,我的服务似乎已关闭,但我没有日志。这也应该在其他线程上捕获异常,对吧?
【解决方案2】:

尝试尝试/捕获main 函数和所有线程函数。这应该可以填补空白,除非第三方代码产生线程

【讨论】:

  • 我很确定我有这个,这让我感到困惑。
  • 您确定没有产生线程吗?您是要进行调试还是打算在生产中使用此日志记录?
  • 线程已生成,我只是确保我在其中捕获了异常。我这样做是为了调试。
  • 不过,我想我可能会错过一个。这就是我希望通过这篇文章来确定的。
【解决方案3】:

您没有指定环境(windows-service 可能意味着托管或非托管)。我猜你正在使用本机代码,可能是 C 或 C++。如果是这种情况,您需要确定您使用的是来自 Windows 的结构化异常处理,而不是 C++ try/catch 机制。根据您的编译器供应商,C++ 实现无法捕获所有异常。

在托管代码中,根据框架版本,存在无法处理的异常。排除这些,如果您不准备受限区域并仔细遵循 CER 规则,您也可能无法捕获异常。也正如其他人提到的,您可以在 AppDomain 中查看未处理的异常。 (您可能不在单个应用程序域中,但这并不常见,如果您不在,您可能会知道)。

在这两种情况下要记住的另一件事是,每个线程都有自己的堆栈和一组异常。如果您尝试尝试/捕获所有异常,则需要捕获代表您工作的每个线程。在托管代码中,终结器线程(执行“析构函数”或终结器代码的垃圾收集器线程)是一个经常被遗漏的地方。

但是,在我跳到其中任何一个之前,我会寻找进程退出或非异常退出子句。

【讨论】:

    猜你喜欢
    • 2013-09-21
    • 2023-03-18
    • 2013-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多