zoukankan      html  css  js  c++  java
  • 如何捕获Wince下form程序的全局异常

    前言

    上两篇文章我们总结了在winform程序下如何捕获全局的异常。那么同样的问题,在wince下我们如何来处理呢?用相同的代码来处理可以吗? 答案是否定的,上面的方案1完全不能解决wince下的情况,而方案二中的一部分就够我们wince情况下使用了。具体的请参考下面的方案。

    捕获wince下的全局异常方案

    下面直接上代码,先来看看我们具体的方案:
    using System;
    using System.Windows.Forms;
    
    namespace VS2008Demo1
    {
        static class Program
        {
            /// <summary>
            /// 应用程序的主入口点。
            /// </summary>
            [MTAThread]
            static void Main()
            {
                ThreadExceptionHandler handler = new ThreadExceptionHandler();
                AppDomain.CurrentDomain.UnhandledException += handler.CurrentDomain_UnhandledException;         
                Application.Run(new ExceptionForm());          
            }
        }
    
        internal class ThreadExceptionHandler
        {
            /// <summary>
            /// 捕获非ui线程的异常
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            public void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
            {
                DialogResult result = DialogResult.Cancel;
                try
                {
                    Exception ex = (Exception)e.ExceptionObject;
                    result = ShowThreadExceptionDialog("应用程序错误", ex);
                }
                catch (Exception exc)
                {
                    try
                    {
                        MessageBox.Show("严重的应用程序错误:" + exc.Message, "应用程序错误", MessageBoxButtons.OK, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1);
                    }
                    finally
                    {
                        Application.Exit();
                    }
                }
                // 点中止时退出程序
                if (result == DialogResult.Abort)
                    Application.Exit();
            }
    
            /// <summary>
            /// 创建错误信息并显示
            /// </summary>
            /// <param name="title"></param>
            /// <param name="e"></param>
            /// <returns></returns>
            private DialogResult ShowThreadExceptionDialog(string title, Exception e)
            {
                string errorMsg = "应用程序错误,请联系管理员," +
                    "错误信息:
    
    ";
                errorMsg = errorMsg + e.Message + "
    
    Stack Trace:
    " + e.StackTrace;
                //在这边记下日志,一般情况下我们可以自定义日志 TODO
                return MessageBox.Show(errorMsg, title, MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Question,
                                       MessageBoxDefaultButton.Button1);
            }
        }
    }
    using System;
    using System.Threading;
    using System.Windows.Forms;
    
    namespace VS2008Demo1
    {
        public partial class ExceptionForm : Form
        {
            public ExceptionForm()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                throw new DllNotFoundException("没有找到数据");
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                Thread th=new Thread(() =>
                    {
                        throw new FormatException("新线程里的格式异常");
                    });
                th.Start();
            }
        }
    }
    好了,代码介绍完了,看一下运行结果: [caption id="attachment_1232" align="alignnone" width="356"]捕获wince全局异常 捕获wince全局异常[/caption] 由于目前手里没有设备,所以用模拟器测试的,上面的结果是点击button1出现的结果,button2的结果我也试过了,都可以捕获到。也就是说上面的代码无论是单线程和多线程在wince的平台上都可以捕获全局的异常。从这点上讲wince是比winform的简单。

    总结

    本文提供了一种在wince平台下编写form程序是捕获全局异常的方案。希望对大家有所帮助。因为Applicaiton在.net compact framework平台下没有事件,所以前面的第一个方案根本不支持,但是上面的方案都已经包括了。 这就是不同平台不同的处理,而且在winform的程序中如果不使用Application的事件,我们是无法捕获UI线程的异常的。因此我们要多研究.net framework的类库,同时也要注意.net framework和.net compact framework的差别,一般情况下桌面平台能实现的wince不一定能实现,wince平台下能实现的桌面平台大部分也能实现。但是也有例外,比如这个方案中的事件就是可以处理所有线程的异常,而同样的方法在winform平台下只能处理非UI线程的异常。
  • 相关阅读:
    IE6 PNG透明终极解决方案(打造W3CfunsIE6PNG最强帖)
    python处理异常(1) 分类: python 20130116 17:59 274人阅读 评论(0) 收藏
    输出列表中出现次数最多的元素 分类: python 20130115 15:25 990人阅读 评论(0) 收藏
    python性能优化摘录 分类: python 20130117 18:01 1192人阅读 评论(0) 收藏
    Pyscripter下载地址及UnicodeEncodeError: 'ascii' codec解决方法 分类: software 问题总结 20130116 15:41 3384人阅读 评论(0) 收藏
    python性能优化摘录(二) 分类: python 20130118 11:27 291人阅读 评论(0) 收藏
    python简明教程os模块 分类: python 20121227 11:54 200人阅读 评论(0) 收藏
    转换时间格式 及 列表综合 分类: python 20121226 17:54 182人阅读 评论(0) 收藏
    lambda()函数 分类: python 20121227 18:01 569人阅读 评论(0) 收藏
    file()创建文件方法 分类: python python基础学习 20121224 18:17 239人阅读 评论(0) 收藏
  • 原文地址:https://www.cnblogs.com/vsdot/p/3263448.html
Copyright © 2011-2022 走看看