现在位置首页 / 项目实战 /正文

wpf教程--捕捉程序异常完整处理方案

作者: IT小兵 | 2014年6月30日| 热度:℃ | 评论: |参与:

目前开发的wpf项目基本完成了。正在处理边角功能。发现在pc正常运行的代码在surface上就出错了。

哈哈,来个surface的照片。


为了更好的给用户更好的体验,并记录程序异常,方便调试修改,需要在wpf程序级别加上异常处理。

1、如何捕捉wpf程序的异常的全局处理:

首先在APP.XAML中定义一个DispatcherUnhandledException事件,如

<Application x:Class="Kaitone.DetectiveHelper.UI.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  Startup="Application_Startup"
             StartupUri="Login.xaml" DispatcherUnhandledException="Application_DispatcherUnhandledException" 
             SessionEnding="Application_SessionEnding">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Themes/ZCThemes/CommProStyle.xaml"/>
                <ResourceDictionary Source="Themes/ZCThemes/MainProStyle.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

然后增加事件的处理函数:APP.cs

    public partial class App : Application
    { 
        public App()
        {
        
        }
        private void Application_Startup(object sender, StartupEventArgs e)
        {
            AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
            Application.Current.DispatcherUnhandledException += Application_DispatcherUnhandledException;
        }
        private void Application_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
        {
            MessageBox.Show("我们很抱歉,当前应用程序遇到一些问题.."+e.Exception,
                "意外的操作", MessageBoxButton.OK, MessageBoxImage.Information);//这里通常需要给用户一些较为友好的提示,并且后续可能的操作
            e.Handled = true;//使用这一行代码告诉运行时,该异常被处理了,不再作为UnhandledException抛出了。
        }
        void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            MessageBox.Show("我们很抱歉,当前应用程序遇到一些问题.请联系管理员." + e.ExceptionObject, "意外的操作", MessageBoxButton.OK, MessageBoxImage.Information);
        }
        private void Application_SessionEnding(object sender, SessionEndingCancelEventArgs e)
        {
        }
    }

注意:要在Application_Startup中增加事件处理函数。

设置    e.Handled = true; 作用就是防止事件冒泡。

用这一行代码告诉运行时,该异常被处理了,不再作为UnhandledException抛出了。


2、线程中的异常处理:

    上面的异常处理说的是主线程UI的异常。如果是线程处理了怎么办?

    

 对于工作线程的未捕获异常,也就是你主线程中,新起了一个线程,然后这个线程抛出的异常。如果你不做特殊处理,则光靠DispatcherUnhandledException是捕获不了的。

      所以,我们就要对工作线程的异常进行重新包装。事实上,也就是用到了WPF中的主线程的Dispatcher。如下代码:

public void 工作函数()
        {
            try
            {
                some code may be throw new Exception("我是工作线程的异常信息");                
            }
            catch (Exception ex)
            {
                PageMain.GetInstance().Dispatcher.Invoke((MethodInvoker)delegate
                    {
                        throw ex;
                    });
            }
        }

注意,上面代码中的PageMain.GetInstance().Dispatcher,就是获取主线程(也即主页面的)的Dispatcher。PageMain.GetInstance()就是主页面的一个单例,想必大家都已经很清楚如何实现了。


3、增加错误日志功能:

为了记录日志,需要把这些数据库保存起来。最好的办法是保存到数据库中。

系统日志管理:操作者,操作日期,操作描述。系统日志的复合搜索功能。

数据库表T_OperationLog

Id,Operator,MakeDate,ActionDesc

接着在程序相应的地方操作数据库表T_OperationLog

在异常的地方进行调用数据库插入操作即可。



点击阅读本文所属分类的更多文章: 项目实战 。和高手一起交流:346717337
友荐云推荐

未注明转发、原文均为本站原创。分享本文请注明 原文链接

给您更多信息和帮助

在这里您可以找到更多:

技术交流群:346717337 Jquery插件交流

投稿:suchso@vip.qq.com

承接:企业网站门户/微网站/微商城/CMS系统/微信公众号运营/业务咨询

抢天猫双11红包
推荐使用阿里云服务器
echarts教程系列
本月最热文章

微信扫一扫,徜徉悠嘻网,您的休闲乐园

微信公众号:快乐每一天

随机文章
标签

技术交流群:346717337

投稿:suchso@vip.qq.com

专业专注:企业网站门户/微网站/微商城/CMS系统/微信公众号运营/付费问题咨询