C# 有没有办法确定试水/捕获覆盖率的差距?

C# 有没有办法确定试水/捕获覆盖率的差距?,c#,windows-services,exception,C#,Windows Services,Exception,我正在调试一个在启动时遇到一些问题的服务。为了帮助我做到这一点,我将几乎所有内容都包装在一个try/catch块中,并将所有错误写入一个文件。我不想把它们放在每个方法中,我只想把它们放在最高级别的方法中,这样它们就可以捕获其他方法的异常 不过,由于服务在某些情况下确实会停止,有些事情正在通过。是否有一种方法可以确定我的try/catch覆盖范围中的差距在哪里,而不是通过视觉?try-to-try/catch主函数和所有线程函数。这将填补空白,除非第三方代码生成线程,否则您可以捕获AppDomai

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


不过,由于服务在某些情况下确实会停止,有些事情正在通过。是否有一种方法可以确定我的try/catch覆盖范围中的差距在哪里,而不是通过视觉?

try-to-try/catch
主函数和所有线程函数。这将填补空白,除非第三方代码生成线程,否则您可以捕获AppDomain级别的异常,如下所示:

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

void CurrentDomain_UnhandledException(Object sender, UnhandledExceptionEventArgs e)
{

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

有关更多示例,请查看此示例。

您没有指定环境(windows服务可能表示托管或非托管)。我猜你在使用本地代码,可能是C或C++。如果是这样的话,你需要确定你是使用Windows中的结构化异常处理,而不是C++尝试/捕获机制。根据编译器供应商,C++实现不能捕捉所有异常。 在托管代码中,根据框架版本,存在不可处理的异常。除此之外,如果不准备约束区域并仔细遵循CER规则,也可能无法捕获异常。正如其他人提到的,您可以在AppDomain中查看未处理的异常。(您可能不在单个应用程序域中,但这并不常见,如果不在,您可能知道)

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


然而,在我跳到这两个之前,我会寻找一个进程退出或非异常退出子句。

这是本机代码还是托管代码?C还是C++?我很确定我有这个,这就是让我困惑的问题。你确定没有线程被生成吗?您是想进行调试还是计划在生产环境中使用此日志记录?线程已经生成,我只是确保捕获其中的异常。我这样做是为了调试。不过我想我可能错过了一个。这就是我希望通过这个帖子来确定的。特别是如果应用程序是用C++编写的;我试过这么做,但我不认为有什么例外。我在服务的OnStart方法的第一行订阅了事件,在handler方法中,我调用了我的日志记录方法,如下所示:Utility.LogError(例如ExceptionObject作为Exception);但是,我的服务似乎已关闭,但我没有日志。这也应该捕获其他线程上的异常,对吗?