Как обрабатывать исключения, возникающие при создании экземпляра приложения WPF? - PullRequest
2 голосов
/ 26 января 2010

Я использую следующий код для отображения необработанных исключений в приложении 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();
            };
        }

Оказывается, у меня есть исключение во время создания приложения, поэтому конструктор приложения никогда не выполняется.

Простой способ воспроизвести его (за другим исключением) - добавить дополнительный «<» перед каким-либо тегом в файле конфигурации вашего приложения и запустить его. </p>

Бесполезное сообщение об ошибке, подобное тому, которое появляется перед вызовом конструктора приложения. альтернативный текст http://srtsolutions.com/cfs-filesystemfile.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mikewoelmer/ExceptionWPF1_5F00_1C1F39AA.jpg

Кто-нибудь знает, как отлавливать подобные исключения?

Примечание: я использую Caliburn , и мое приложение расширяет приложение CaliburnApplication.

1 Ответ

4 голосов
/ 26 января 2010

Хорошо. Я решил проблему, выполнив следующее:

  • Измените Build Action файла App.xaml с ApplicationDefinition на Page.

  • Создайте новый класс, подобный следующему:


    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);
            }
        }
    }

Он заменяет сгенерированный метод App.g.cs Main на этот, поэтому у нас есть шанс отловить исключения.

...