gpt4 book ai didi

c# - WindowClosing方法出现异常时WPF应用程序关闭

转载 作者:行者123 更新时间:2023-11-30 23:29:25 25 4
gpt4 key购买 nike

我发现当 MainWindow#Window_Closing 方法中发生异常时,即使我在异常前设置了 e.cancel = true 并在 App#DispatcherUnhandledException 中设置了 e.handled = true,应用程序仍然关闭。我在 Application_Exit 方法中设置了一个断点,堆栈跟踪显示关闭是由 ExceptionWrapper.InternalRealCall -> Application.ShutdownCallback -> Application.ShutdownImpl -> Application.DoShutdown

谁能帮我理解为什么会发生这种情况,有什么方法可以避免在 Window_Closing 方法中发生异常时应用程序关闭? (我知道我总是可以用这个方法捕获所有异常,但我想知道是否有更好的方法来避免意外异常杀死应用程序)

下面是重现此问题的示例代码。单击窗口关闭按钮可重现此问题。

谢谢。

主窗口.xaml.cs

public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
e.Cancel = true;
throw new Exception();
}
}

App.xaml.cs

public partial class App : Application
{
private void Application_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
e.Handled = true;
}
private void Application_Exit(object sender, ExitEventArgs e)
{
var exitCode = e.ApplicationExitCode;
}
}

应用.xaml

<Application x:Class="WpfApplication1.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1"
StartupUri="MainWindow.xaml" DispatcherUnhandledException="Application_DispatcherUnhandledException" Exit="Application_Exit">

主窗口.xaml

<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApplication1"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525" Closing="Window_Closing">

最佳答案

捕获 DispatcherUnhandledException 很好,但这还没有结束。如果您捕获它并将 Handled 设置为 true,则应用程序会说“确定”,然后关闭。如果 Handled 设置为 false,它会说“仍然需要一些检查”,然后如果设置了 AppDomain UnhandledException,它会调用:

在您的 App.xaml.cs 文件中:

private void Application_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
e.Handled = false;
}

private void Application_Startup(object sender, StartupEventArgs e)
{
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
}

private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
MessageBox.Show(string.Format("Is Terminating: {0}\r\n{1}", e.IsTerminating, e.ExceptionObject.ToString()));
}

这里 CurrentDomain_UnhandledException 方法只会在我将 Handled 设置为 false 时调用。无论哪种方式,应用程序都会下降。

请注意,UnhandledExceptionEventArgs 没有 Handled 属性,但它有一个 IsTerminating 属性。不过,我不确定在什么情况下这会是错误的。

编辑 - 事实证明,只有当兼容性设置为 .NET 1.0 和 1.1 时,IsTerminating 才会为 false,因为在这些版本的框架中,某些后台线程中未处理的异常不会导致应用程序关闭。从 2.0 开始,所有未处理的异常都会导致应用关闭。

关于c# - WindowClosing方法出现异常时WPF应用程序关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35437808/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com