如何捕获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 = "应用程序错误,请联系管理员," +
"错误信息:\n\n";
errorMsg = errorMsg + e.Message + "\n\nStack Trace:\n" + 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全局异常[/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线程的异常。
如何捕获Wince下form程序的全局异常的更多相关文章
- 嵌入式系统WinCE下应用程序GUI界面开发【转】
嵌入式系统WinCE下应用程序GUI界面开发 ByToradex 秦海 本文旨在介绍嵌入式系统在Wince下进行GUI应用程序开发可以选择的不同GUI开发框架(Framework),目前最常用的几种方 ...
- 如何捕获winform程序全局异常?(续)
前言 上篇文章我提供了一种方案可以供我们捕获单线程程序中的所有未处理异常.但是如果程序是多线程,那么新增线程出现了异常上个方案就无能为力了.本着方案总比问题多的态度,我再给大家提供一种新的方案,供大家 ...
- 转:如何捕获winform程序全局异常?
前言 上篇文章我提供了一种方案可以供我们捕获单线程程序中的所有未处理异常.但是如果程序是多线程,那么新增线程出现了异常上个方案就无能为力了.本着方案总比问题多的态度,我再给大家提供一种新的方案,供大家 ...
- 如何捕获winform程序全局异常?
1.在C#中我们如何处理异常? 上面的问题学过C#的问题大家可能都能回答处理,用try-catch-finally具体如下: try { //可能出错的语句 } catch (Exception) { ...
- atitit.js浏览器环境下的全局异常捕获
atitit.js浏览器环境下的全局异常捕获 window.onerror = function(errorMessage, scriptURI, lineNumber) { var s= JSON. ...
- .Net下的全局异常捕获问题
全局异常捕获主要目标并不是为了将异常处理掉防止程序崩溃.因为当错误被你的全局异常捕获器抓到的时候,已经证实了你程序中存在BUG. 一般而言,我们的全局异常捕获主要作用就是接收到异常之后进行异常的反馈. ...
- WinCE平台的程序编译到Win32平台下运行
最近做的项目中,有一个在WinCE平台上跑的程序,后来随着项目的发展,要求此程序在PC上也能跑.感谢VS 2005提供的多平台支持,只需要几分钟就可以解决这个问题,方法很简单,下面是我处理的过程. 1 ...
- 在Global.asax中 注册Application_Error事件 捕获全局异常
参考于:https://shiyousan.com/post/635813858052755170 在ASP.NET MVC中,通过应用程序生命周期中的Application_Error事件可以捕获到 ...
- C#中的那些全局异常捕获
1.WPF全局捕获异常 public partial class App : Application { public App() { // 在异 ...
随机推荐
- U-Boot在FL2440上移植(四)----支持网卡DM9000和烧写yaffs文件系统
<一>支持网卡芯片DM9000 在driver下,有网卡驱动DM9000x.c 和 DM9000x.h DM9000接在BANK4,位宽16 在include/configs/TX2440 ...
- Error Unable to start the Genymotion virtual device.解决
The Genymotion virtual device could not obtain an IP address.For an unknown reason.VirtualBox DHCP h ...
- vs2010 调试中监视变量
在msdn中写了如何查看调试的数据,网址: http://msdn.microsoft.com/zh-cn/library/vstudio/esta7c62(v=vs.100).aspx Visual ...
- 用merge into进行性能优化
有时候开发组有这么一个需求,一个表和它的备份表,把备份表中的某些字段替换到原表中,当数据量非常大的时候就很很慢,这个时候如果我们用merge into往往会提高几倍的性能,下面我们来做个实验: SQL ...
- swift优秀学习博客
http://www.00red.com/ http://www.cnblogs.com/kenshincui/ 优秀的某博客,包含大量iOS的全面的总结 https://github.com/Co ...
- 我写的一个 Qt 显示图片的控件
Qt 中没有专门显示图片的控件.通常我们会使用QLabel来显示图片.可是QLabel 显示图片的能力还是有点弱.比方不支持图像的缩放一类的功能.使用起来不是非常方便. 因此我就自己写了个简单的类. ...
- ASP.NET路由
ASP.NET 路由使您可以使用不必映射到网站中特定文件的 URL. 由于该 URL 不必映射到文件,因此可以使用对用户操作进行描述因而更易于被用户理解的 URL. ASP.NET MVC 框架和 A ...
- C#_会员管理系统:开发五(用户注册)
创建一个新的用户注册窗体(VIPRegistration.cs): 用户注册窗体(VIPRegistration.cs)详细代码如下: using System; using System.Colle ...
- VIM: 解决vi/vim中粘贴时行首出现很多缩进和空格的问题
解决vi/vim中粘贴时行首出现很多缩进和空格的问题 http://www.jbxue.com/LINUXjishu/12232.html 由于在secureCRT中会将原来的文本原封不动的按照字符串 ...
- 由zImage生成uImage
一.手动使用mkimage命令 mkimage -A arm -O linux -T kernel -C none -a 30007fc0 -e 30007fc0 -n uImage -d /wo ...