在什么情况下 .NET 程序会终止

本文关键字:终止 程序 NET 情况下 在什么 | 更新日期: 2023-09-27 18:33:16

我有一个为.NET 4完整框架编写的WPF应用程序。 应用程序使用 SQL Anywhere 作为其数据库。我的应用程序有一个未处理的异常处理程序,该处理程序始终将错误记录到程序的自定义事件日志中。 然后,它会向用户显示错误消息。 每当程序要执行某些操作时,该程序还会向事件日志发送消息,以便更轻松地进行调试。

该应用程序安装在用户的笔记本电脑上,该笔记本电脑运行 Windows 7 并具有 8 GB 的 RAM。 在此计算机上启动时,将显示初始屏幕,然后显示程序的主窗口。 绘制后不到一秒钟,程序就死了。 不显示任何错误消息。

检查

事件日志显示,程序最后写入的消息是它正在检查数据库中是否存在用户。 没有错误消息。

显示的最后一条消息后面的代码是对执行某些参数检查然后执行以下 EF 查询的方法的调用:

LPRCore.CarSystem.User user = null;
IQueryable<User> query = from u in context.Users
                         from m in context.Members.Where( m => m.UserId == u.UserId )
                                                  .DefaultIfEmpty()
                         where u.LoweredUserName == userName.ToLower() && m == null
                         select u;
try {
    user = query.SingleOrDefault();
} catch ( Exception ex ) {
    ....
}

我无法判断是否调用了 catch 块中的代码。 我怀疑它正在被调用并且那里发生了异常。

我的问题是,如果在 catch 块中发生异常,如果没有其他异常处理程序来捕获错误,该异常不会被上层的未处理异常处理程序捕获吗? 还是会导致程序在没有报告任何内容的情况下死亡?

在什么情况下 .NET 程序会终止

我的问题是,如果在 catch 块中发生异常,如果没有其他异常处理程序来捕获错误,该异常不会被上层的未处理异常处理程序捕获吗?还是会导致程序在没有报告任何内容的情况下死亡?

异常

将向上传播,应由未处理的异常处理程序捕获。

话虽如此,某些异常不会被捕获,例如 StackOverflowException . 异常块(或数据库提供程序...?(中的代码也可能以不允许异常处理工作的方式终止进程(即:调用Environment.Exit或同样糟糕的东西(。

简而言之,一个未经处理的异常

请记住,至少应该在 2 个位置记录未经处理的异常。Application.DispatcherUnhandledException每个应用程序的 AppDomain UnhandledException 处理程序。

如果您没有捕获这些内容,应用程序将终止。

另请注意,自 .NET 2.0 起,线程中未经处理的异常会传播到应用程序,从而导致应用程序终止(不是线程的应用(。在 .NET 1.1 中,线程刚刚悄悄地死了。

从 .NET Framework 2.0 版开始,公共语言运行库允许线程中大多数未经处理的异常自然进行。在大多数情况下,这意味着未处理的异常会导致应用程序终止。

(托管线程中的异常(

应用程序对象的 ThreadException 处理程序似乎只捕获从应用程序主线程向上传播的异常(或者更准确地说,在应用程序调度程序线程中引发的异常(。其他所有内容似乎都出现在应用程序域的 UnhandledException 处理程序上。

因此,除了 Application.UnhandledException 处理程序之外,还要添加域。未处理的异常如下所示:

static void Main(string[] args)
{
    Application.ThreadException += ApplicationThreadException;

    AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
}
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    // Log exception here and exit application, you can't recover now.
}

需要注意的是,如果您最终进入这些"全局"异常处理程序中的任何一个,您的应用程序将处于未知但损坏的状态,唯一有效的方法是记录问题并退出/重新启动应用程序;此时您无法恢复,即使您仍然可以让应用程序运行。