注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天涯倦客的博客

祝福你朋友永远快乐!

 
 
 

日志

 
 

处理Application.ThreadException异常, 拦截GUI主线程的异常  

2013-08-12 14:16:02|  分类: C# |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

(转)

.Net Winform有着自己的未处理异常机制。 Winform内部的代码会在Applicatin.Run方法里面为消息循环创建一个大的try...catch。这样, 任何在GUI主线程里面的异常都会被这个try...catch所捕捉到,这个默认的未处理异常handler会提取异常的所有信息然后显示在一个错误对话框里面,接着程序就中止了。这样我的try...catch就没有作用了,即下面的捕捉异常的代码是无效的。
static void Main()
{
    try
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new mainfrm());
    }
     catch(Exception e)
    {
        MessgaeBox.Show(e.Message);
    }
}
Application.ThreadException事件在异常被抛出时触发,

对于这个问题,可以处理Application.ThreadException异常,这样就可以拦截GUI主线程里面的异常了:

        static void Main()
        {
            //// Setup unhandled exception handlers
            //AppDomain.CurrentDomain.UnhandledException += // CLR
            //   new UnhandledExceptionEventHandler(OnUnhandledException);

 

            Application.ThreadException += // Windows Forms
         new System.Threading.ThreadExceptionEventHandler(
             OnGuiUnhandedException);


            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }

 

        //// CLR unhandled exception
        //private static void OnUnhandledException(Object sender,
        //   UnhandledExceptionEventArgs e)
        //{
        //    HandleUnhandledException(e.ExceptionObject);
        //}

 

        // Windows Forms unhandled exception
        private static void OnGuiUnhandedException(Object sender,
           ThreadExceptionEventArgs e)
        {
            HandleUnhandledException(e.Exception);
        }

 

        static void HandleUnhandledException(Object o)
        {
            Exception e = o as Exception;

            if (e != null)
            { // Report System.Exception info
                MessageBox.Show("Exception = " + e.GetType());
                MessageBox.Show("Message = " + e.Message);
                MessageBox.Show("FullText = " + e.ToString());
            }
            else
            { // Report exception Object info
                MessageBox.Show("Exception = " + o.GetType());
                MessageBox.Show("FullText = " + o.ToString());
            }

            MessageBox.Show("An unhandled exception occurred " +
               "and the application is shutting down.");
            Environment.Exit(1); // Shutting down
        }

 

上述状态是编译成EXE后调试的结果,在IDE环境中情况不同。

  评论这张
 
阅读(474)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017