首页  ·  知识 ·  编程语言
WINFORM应用程序未处理异常的统一处理技巧
泽雯  MrYoung  .NET  编辑:泽雯   图片来源:网络
异常处理是每个应用程序都会用到的,纵然在程序编写期间我们都会最大限度的考虑可能发生的异常并进行相应的处理,但是往往并不能完全考虑周全,百密一疏,出现未处理异常而导致程序出错,数据丢

异常处理是每个应用程序都会用到的,纵然在程序编写期间我们都会最大限度的考虑可能发生的异常并进行相应的处理,但是往往并不能完全考虑周全,百密一疏,出现未处理异常而导致程序出错,数据丢失,如用户输入错误数据,网络断开,数据库连接失败等等。这时系统会弹出错误窗口,无论对于自身的代码安全还是良好的用户体验出发,这种现象都是不好的,一个健壮,成熟的应用程序应该有良好的容错能力,并且在出错后自动做出相应BUG的处理,记录,本文和大家探讨这种情况的一般处理方法,老鸟请直接飘过,都是些基础。

 

原理:在应用程序入口点使用SetUnhandledExceptionMode处理未捕捉的异常,订阅Application.ThreadException,AppDomain.CurrentDomain.UnhandledException事件,创建我们自己的异常处理方法,可以是打开一个统一的异常处理窗体告诉使用者发生了错误,然后记录错误详细信息,因为这旨在说明原理,这部分只是弹出信息表示错误发生并记录,大家可以根据自身实际需求做处理,如出错后弹出一个漂亮的出错提示窗体,把出错详细信息记录到文本、数据库,发送出错邮件到作者信箱或出错后重新初始化等,这就是仁者见仁智者见智,大家自己做了。

 

演示程序功能:一个除零异常按钮,一个显示抛出异常按钮,均为做TRY CATCH异常处理,发生错误后通过统一的未处理异常处理处理异常,在程序文件夹下生成ErrLog/ ErrLog.txt文件记录详细出错信息并弹出统一出错窗体,程序并不会发生BUG而异常关闭。程序下载:http://download.csdn.net/source/2601973


blob.png

关键代码如下:


                //处理未捕获的异常,始终将异常传送到 ThreadException 处理程序。忽略应用程序配置文件。   


              Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);


                //订阅ThreadException事件,处理UI线程异常,处理方法为 Application_ThreadException,关于事件的相关知识就不在这叙述了  


                Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);


                //订阅UnhandledException事件,处理非UI线程异常 ,处理方法为 CurrentDomain_UnhandledException  


                AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);



        /// <summary>

        ///这就是我们要在发生未处理异常时处理的方法,我这是写出错详细信息到文本,给大家做个参考

        ///做法很多,可以是把出错详细信息记录到文本、数据库,发送出错邮件到作者信箱或出错后重新初始化等等

        ///这就是仁者见仁智者见智,大家自己做了。

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)

        {

            string str = "";

            string strDateInfo = "出现应用程序未处理的异常:" + DateTime.Now.ToString() + "/r/n";

            Exception error = e.Exception as Exception;

            if (error != null)

            {

                str = string.Format(strDateInfo + "异常类型:{0}/r/n异常消息:{1}/r/n异常信息:{2}/r/n",

                     error.GetType().Name, error.Message, error.StackTrace);

            }

            else

            {

                str = string.Format("应用程序线程错误:{0}", e);

            }


            if (!Directory.Exists("ErrLog"))

            {

                Directory.CreateDirectory("ErrLog");

            }

            writeLog(str);    

            MessageBox.Show("发生致命错误,请及时联系作者!", "系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);

        }


本文作者:泽雯 来源:MrYoung
CIO之家 www.ciozj.com 微信公众号:imciow
    >>频道首页  >>网站首页   纠错  >>投诉
版权声明:CIO之家尊重行业规范,每篇文章都注明有明确的作者和来源;CIO之家的原创文章,请转载时务必注明文章作者和来源;
延伸阅读