有没有办法确定try / catch覆盖范围的差距?

时间:2010-03-16 15:47:04

标签: c# windows-services exception

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

但是,有些东西正在通过,因为服务在某些条件下会停止。有没有办法确定我的尝试/捕获覆盖范围内的差距在哪里,除了通过视线?

3 个答案:

答案 0 :(得分:4)

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

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

void CurrentDomain_UnhandledException(Object sender, UnhandledExceptionEventArgs e)
{

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

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

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