如何处理Windows Forms程序中未处理的异常

如果Windows Forms程序中有未被捕获的异常,会导致程序崩溃并且给用户造成不良的印象。例如下面的程序,模拟了一个未捕获的异常:

按钮事件为:

private void button1_Click(object sender, EventArgs e)

{
     throw new Exception();
}

点击Exception 按钮,会弹出如下默认窗口

Windows Forms提供了两个事件来处理未捕获的异常发生时的情况,分别是 Application.ThreadException和AppDomain.UnhandledException事件,前者用来处理UI线程中的异常,后者处理其他线程中的异常。要使程序使用自定义的事件来处理异常,可以使用如下代码:

static class Program
   {
     /// <summary>
     /// The main entry point for the application.
     /// </summary>
     [STAThread]
     static void Main()
     {
       Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
       AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

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

     static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
     {
       MessageBox.Show("抱歉,您的操作没有能够完成,请再试一次或者联系软件提供商");
       LogUnhandledException(e.ExceptionObject);
     }

     static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
     {
       MessageBox.Show("抱歉,您的操作没有能够完成,请再试一次或者联系软件提供商");
       LogUnhandledException(e.Exception);
     }

     static void LogUnhandledException(object exceptionobj)
     {
       //Log the exception here or report it to developer
     }
   }

此时运行该程序的结果如下:

时间: 2025-01-01 17:01:56

如何处理Windows Forms程序中未处理的异常的相关文章

windows应用程序中获取控制台输出信息

问题描述 我在一个C#Windows应用程序中启动一个控制台程序,这个控制台程序输了很多信息我怎么才能在C#windows应用程序中获得这些信息 解决方案 解决方案二:是不是什么重定向??学习解决方案三:专业接分,参考http://blog.csdn.net/jinjazz/archive/2008/05/07/2413039.aspx解决方案四:引用2楼jinjazz的回复: 专业接分,参考http://blog.csdn.net/jinjazz/archive/2008/05/07/2413

C#中windows应用程序中怎么样实现复制,粘贴,新建的功能???

问题描述 在C#中windows应用程序中怎么样实现复制,粘贴的功能,就是,如果要开发一个记事本,如果我要像操作系统你自带的那个记事本一样,那复制,粘贴的,新建的功能怎么去实现?就是在编写代码的时候要怎么去做?那代码是什么?要怎样写??? 解决方案 解决方案二:基本的文件访问控制类,就是实现文件的复制和粘贴.解决方案三:你这一个问题牵涉多少问题,让我们无从回答,我做过有源代码解决方案四:在MSDN里查Clipboard解决方案五:Clipboard.GetText();Clipboard.Set

在 Windows 应用程序中使用 Windows XP 的外观风格和 PrintWindow(转)

注意:此示例仅适用于运行 Windows XP 的计算机.打开示例并打开两个或多个应用程序窗口之后,请使用 AltTab 功能键来运行 TaskSwitcher 应用程序.摘要:本文介绍了一种增强的 AltTab 应用程序 TaskSwitcher,并以此为框架演示了在 Windows 应用程序中使用 Windows XP 新的外观风格和 PrintWindow 的方法.目录简介 TaskSwitcher 应用程序 截取键盘输入 枚举顶层应用程序窗口 显示顶层应用程序窗口 使用 Comctl32

Enterprise Library 2.0 技巧(3):记录ASP.NET站点中未处理的异常

这篇文章不能算是Enterprise Library 2.0的一个技巧,只是Logging Application Block的一个简单应用而已,在这里我们使用Logging Application Block来记录一个ASP.NET 2.0站点中未处理的异常到数据库中,当然你也可以记录到文本文件中,或者发送到指定的Email中,下面看一下具体的实现步骤. 1.创建数据库表和存储过程 在安装目录的src\Logging\TraceListeners\Database\Scripts文件夹下,执行

未处理的“System.StackOverflowException”类型的异常出现在 System.Windows.Forms.dll 中。

问题描述 在程序中为DataGridView设置DataSource后出现如题目错误注释后不会有错我是在窗体的Load事件方法中设置的只是一个新窗体的实例化,怎么会有死循环呢?求教高手! 解决方案 解决方案二:代码不贴谁能知道啊?解决方案三:要是本窗体的话用this.就可以了!

在Windows应用程序中实现电子注册功能

目前,国内软件销售过程中采用了一种新的方式:开发者根据计算机中不同的硬件配置标志直接在应用程序中设置密钥,限制程序的使用次数或者限制某些先进功能的使用,然后将受限制的应用程序无偿提供给用户.用户在试用一段时间之后如果觉得很满意,就可以将安装程序提取的硬件配置解密密钥或已经采集机器配置情况的应用程序提供给开发者,并花少量费用购买自己机器中的电子注册密钥,从而能够充分利用应用程序的所有功能. 在应用程序中利用电子注册来限制应用程序的部分功能,这样既可以让用户先试用然后再决定是否购买应用程序,又保护了

在 .NET Framework 2.0 中未处理的异常导致基于 ASP.NET 的应用程序意外退出_实用技巧

但是,系统日志中可能会记录类似于以下内容的事件消息: 事件类型:警告 事件来源:W3SVC 事件类别:无 事件 ID: 1009 日期: 9/28/2005 时间:3:18:11 PM 用户:N/A 计算机:IIS-SERVER 描述: 为应用程序池"DefaultAppPool"提供服务的进程意外终止.进程 ID 是"2548".进程退出代码是"0xe0434f4d". 而且,应用程序日志中可能会记录类似于以下内容的事件消息: 事件类型:错误

捕捉WPF应用程序中XAML代码解析异常

由于WPF应用程序中XAML代码在很多时候是运行时加载处理的.比如DynamicResource,但是在编译或者运行的过程中,编写的XAML代码很可能有错误,此时XAML代码解析器通常会抛出称为XamlParseException的异常.但是抛出的XamlParseException异常提供的信息非常简单,或者是很不准确.此时我们关于通过对变通的方法来获取更多的异常信息: 我们知道,WPF应用程序中的XAML代码是在InitializeComponent方法中解析的.而这个方法通常位于窗口对象的

ASP程序中调用函数Now()异常的问题

新上的一台服务器出现了一个现象:ASP程序中,调用函数Now(),显示的时间总是形如"2009-07-12 上午 08:12:56 "这样的,总显示"上午"和"下午",解决过程及最终解决方法如下: 这么显示,一般都是因为服务器就是如此设置的,先查看时间格式:直接双击任务栏中时间,在弹出的"时间和日期"中果然显示了上午下午这样的字样,那就进入下一步设置: 打开控制面板,选择"区域和语言选项",在"区