WPF:如果Loaded事件中发生异常,应用程序不会崩溃

mez*_*eze 6 c# wpf exception

我创建了一个新的WPF应用程序,并为MainWindow中的Loaded事件添加了一个事件处理程序:

Loaded += (s, e) => { throw new Exception("AAAA!"); };
Run Code Online (Sandbox Code Playgroud)

然后我从Visual C#启动此应用程序,应用程序不会崩溃也不显示未捕获的异常.

我希望它会崩溃,这个应用程序确实在其他计算机上崩溃了.但为什么它适用于我的?

更新 添加了截图:截图

Run*_*tad 6

要捕获异常,您需要在Loaded方法中执行try/catch,或者可以告诉Dispatcher在发生未处理的异常时通知您.

尝试以下操作,例如在应用程序的OnStartup方法中:

App.Current.DispatcherUnhandledException += (s,e) => 
{ 
  // Handle the exception here
  var ex = e.Exception; 
};
Run Code Online (Sandbox Code Playgroud)

编辑:

如果您希望应用程序崩溃,请尝试以下操作:

App.Current.DispatcherUnhandledException += (s,e) => 
{ 
  // this should cause your application to crash :-)
  throw new Exception("Now it should crash!", e.Exception);
};
Run Code Online (Sandbox Code Playgroud)

这里的不同之处在于我们创建了一个在UI线程上抛出的新异常.


eFl*_*loh 4

Loaded 事件可能是从后台线程调用的。当该线程中抛出异常时,它将被终止,但不会影响您的主应用程序线程。这种行为可以在许多事件处理程序中看到,例如 Timer_Elapsed 事件处理程序通常也不会影响您的代码。这并不意味着您不应该关心此类代码中的异常!

  • 作为一名开发人员,如果我没有捕获所有异常,我希望我的应用程序崩溃。我不希望我的应用程序在出现问题时继续运行。我也不明白为什么“Loaded”会在另一个线程上被触发。我刚刚尝试过: `Loaded += (s, e) => { if (this.Dispatcher.Thread.Equals(Thread.CurrentThread)) Thread.Sleep(4000); 抛出新的异常(“啊啊啊!”);};`。窗口冻结 4 秒,然后一切正常,不再出现“此应用程序已停止工作”对话框。 (2认同)