RuntimeWrappedException VS UnhandledException

时间:2010-11-04 19:41:54

标签: c# exception

这是处理这两种情况的最佳方法吗?

 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 个答案:

答案 0 :(得分:1)

Main()方法中的异常处理程序永远不会运行。 Dispatcher.UnhandledException处理程序将阻止app.Run()因异常而退出。您在事件处理程序中设置e.Handled = true。不要让它保持沉默,让用户知道kaboom的内容。

“unhandledInstalled”变量很奇怪。你安装了一个,它总是如此。如果代码在 try块之前崩溃,则没有理由尝试做一些有意义的事情,真的错误发生了。

答案 1 :(得分:0)

我认为我做对了,但我还是无法测试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;
    }