RuntimeWrappedException VS UnhandledException - PullRequest
       2

RuntimeWrappedException VS UnhandledException

1 голос
/ 04 ноября 2010

Это лучший подход для обработки обоих случаев?

 public static class Program
{
    //http://blogs.microsoft.co.il/blogs/arik/archive/2010/05/28/wpf-single-instance-application.aspx
    //http://social.msdn.microsoft.com/forums/en-US/wpf/thread/dee46bde-9baa-46b6-889c-04e20dd04029
    //http://msdn.microsoft.com/en-us/library/ms404228.aspx?appId=Dev10IDEF1&l=EN-US&k=k%28CS1058%29;k%28TargetFrameworkMoniker-%22.NETFRAMEWORK&k=VERSION=V4.0%22%29&rd=true

    [STAThread]
    public static Int32 Main(string[] args)
    {
        bool unhandledInstalled = false;
        try
        {
            AppDomain.CurrentDomain.UnhandledException += UnhandledException;
            unhandledInstalled = true;

            var app = new App();
            app.DispatcherUnhandledException += DispatcherUnhandledException;
            return app.Run();
        }
        catch (SecurityException)
        {
            // Notify
        }
        catch (Exception e)
        {
            var rwe = e as RuntimeWrappedException;
            if (rwe != null)
            {
                object wrappedException = rwe.WrappedException;
                MessageBox.Show(wrappedException.ToString());
            }

            if (unhandledInstalled)
                throw;

            // No handler has been installed but handle it anyway.
            UnhandledException(null, new UnhandledExceptionEventArgs(e, true));
        }

        return -1;
    }

    private static void UnhandledException(object sender, UnhandledExceptionEventArgs args)
    {
        MessageBox.Show(args.ExceptionObject.ToString());
        Environment.Exit(-1);
    }

    private static void DispatcherUnhandledException(object sender,
                                                     DispatcherUnhandledExceptionEventArgs e)
    {
        // Do something here
        e.Handled = true;
    }
}

Спасибо!

Ответы [ 2 ]

1 голос
/ 04 ноября 2010

Ваш обработчик исключений в методе Main () никогда не запустится.Обработчик Dispatcher.UnhandledException предотвратит выход app.Run () из-за исключения.Вы устанавливаете e.Handled = true в обработчике событий.Не заставляйте его молчать, дайте пользователю знать, что что-то пошло kaboom.

Переменная "unhandledInstalled", кстати, странная.Вы установили один, это всегда правда.Если код вылетает до блока try, то нет смысла пытаться сделать что-то значимое, что-то действительно случилось плохо.

0 голосов
/ 05 ноября 2010

Я думаю, что все правильно, но я не смог протестировать RuntimeWrappedException, и я просто обнаружил, что DispatcherUnhandledException обрабатывает все внутри приложения, я думал, что это строго для Dispatcher.BeginInvoke ().*

Спасибо,

        [STAThread]
    public static Int32 Main(string[] args)
    {
        try
        {
            AppDomain.CurrentDomain.UnhandledException += UnhandledException;

            var app = new App();
            app.DispatcherUnhandledException += DispatcherUnhandledException;
            int run = app.Run();

            return run;
        }
        catch (SecurityException)
        {
            // Notify & exit
        }
        catch (Exception e)
        {
            var rwe = e as RuntimeWrappedException;
            if (rwe != null)
            {
                object wrappedException = rwe.WrappedException;
                MessageBox.Show(wrappedException.ToString());
                Environment.Exit(-1);
            }

            throw;
        }

        return -1;
    }

    private static void UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        MessageBox.Show(e.ExceptionObject.ToString());
        Environment.Exit(-1);
    }

    private static void DispatcherUnhandledException(object sender,
                                                     DispatcherUnhandledExceptionEventArgs e)
    {
        MessageBox.Show(e.Exception.ToString());

        // Decide if we exit or not
        // ...

        e.Handled = true;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...