如何处理WPF应用程序实例化过程中抛出的异常?

Raf*_*mão 2 wpf constructor exception caliburn

我使用以下代码来显示 WPF 应用程序中未处理的异常:


        public MyApplication() {
            this.DispatcherUnhandledException += (o, e) => {
                var exceptionMessage = new ExceptionWindow();
                exceptionMessage.ExceptionMessage.Text = e.Exception.Message;
                exceptionMessage.ExceptionCallStack.Text = e.Exception.StackTrace;
                exceptionMessage.ExceptionInnerException.Text = e.Exception.InnerException.Message;
                exceptionMessage.WindowStartupLocation = WindowStartupLocation.CenterScreen;
                exceptionMessage.WindowStyle = WindowStyle.ToolWindow;
                exceptionMessage.ShowDialog();
                e.Handled = true;
                Shell.Close();
            };
        }
Run Code Online (Sandbox Code Playgroud)

事实证明,我在应用程序实例化期间出现异常,因此应用程序构造函数永远不会执行。

重现它的一种简单方法(有不同的例外)是在应用程序配置文件中的某些标记之前引入额外的“<”并运行它。

在调用应用程序构造函数之前会出现类似这样的无用错误消息。 替代文本http://srtsolutions.com/cfs-filesystemfile.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mikewoelmer/ExceptionWPF1_5F00_1C1F39AA.jpg

有谁知道如何捕获此类异常?

备注:我正在使用Caliburn,并且我的应用程序扩展了 CaliburnApplication。

Raf*_*mão 5

好的。我通过执行以下操作解决了该问题:

  • Build Action将文件的名称App.xaml从更改ApplicationDefinitionPage.

  • 创建一个新类,如下所示:


    public class AppStartup {
        [STAThread]
        static public void Main(string[] args) {
            try {
                App app = new App();
                app.InitializeComponent();
                app.Run();
            }
            catch (Exception e) {
                MessageBox.Show(e.Message + "\r\r" + e.StackTrace, "Application Exception", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

它用这个方法替换了生成的 App.g.cs Main 方法,因此我们有机会捕获异常。