捕获异常 winform

可以捕获winform中的异常写到文本中

 1  [STAThread]
 2         static void Main()
 3         {
 4             try
 5             {
 6                 //处理未捕获的异常
 7                 Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
 8                 //处理UI线程异常
 9                 Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
10                 //处理非UI线程异常
11                 AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
12                 Application.EnableVisualStyles();
13                 Application.SetCompatibleTextRenderingDefault(false);
14                 Application.Run(new Form1());
15             }
16             catch (Exception ex)
17             {
18                 string str = "";
19                 string strDateInfo = "出现应用程序未处理的异常:" + DateTime.Now.ToString() + "\r\n";
20                 if (ex != null)
21                 {
22                     str = string.Format(strDateInfo + "异常类型:{0}\r\n异常消息:{1}\r\n异常信息:{2}\r\n",
23                        ex.GetType().Name, ex.Message, ex.StackTrace);
24                 }
25                 else
26                 {
27                     str = string.Format("应用程序线程错误:{0}", ex);
28                 }
29
30                 writeLog(str);
31                 //frmBug f = new frmBug(str);//友好提示界面
32                 //f.ShowDialog();
33                 MessageBox.Show("发生致命错误,请及时联系作者!", "系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
34             }
35         }
36         /// <summary>
37         ///这就是我们要在发生未处理异常时处理的方法,我这是写出错详细信息到文本,如出错后弹出一个漂亮的出错提示窗体,给大家做个参考
38         ///做法很多,可以是把出错详细信息记录到文本、数据库,发送出错邮件到作者信箱或出错后重新初始化等等
39         ///这就是仁者见仁智者见智,大家自己做了。
40         /// </summary>
41         /// <param name="sender"></param>
42         /// <param name="e"></param>
43         static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
44         {
45
46             string str = "";
47             string strDateInfo = "出现应用程序未处理的异常:" + DateTime.Now.ToString() + "\r\n";
48             Exception error = e.Exception as Exception;
49             if (error != null)
50             {
51                 str = string.Format(strDateInfo + "异常类型:{0}\r\n异常消息:{1}\r\n异常信息:{2}\r\n",
52                    error.GetType().Name, error.Message, error.StackTrace);
53             }
54             else
55             {
56                 str = string.Format("应用程序线程错误:{0}", e);
57             }
58             writeLog(str);
59             //frmBug f = new frmBug(str);//友好提示界面
60             //f.ShowDialog();
61             MessageBox.Show("发生致命错误,请及时联系作者!", "系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
62         }
63         static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
64         {
65             string str = "";
66             Exception error = e.ExceptionObject as Exception;
67             string strDateInfo = "出现应用程序未处理的异常:" + DateTime.Now.ToString() + "\r\n";
68             if (error != null)
69             {
70                 str = string.Format(strDateInfo + "Application UnhandledException:{0};\n\r堆栈信息:{1}", error.Message, error.StackTrace);
71             }
72             else
73             {
74                 str = string.Format("Application UnhandledError:{0}", e);
75             }
76             writeLog(str);
77             //frmBug f = new frmBug(str);//友好提示界面
78             //f.ShowDialog();
79             MessageBox.Show("发生致命错误,请停止当前操作并及时联系作者!", "系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
80         }
81         /// <summary>
82         /// 写文件
83         /// </summary>
84         /// <param name="str"></param>
85         static void writeLog(string str)
86         {
87             if (!Directory.Exists("ErrLog"))
88             {
89                 Directory.CreateDirectory("ErrLog");
90             }
91
92             using (StreamWriter sw = new StreamWriter(@"ErrLog\ErrLog-"+DateTime.Now.ToString("yyyy-MM-dd")+".txt", true, System.Text.Encoding.UTF8))
93             {
94                 sw.WriteLine(str);
95                 sw.WriteLine("---------------------------------------------------------");
96
97                 sw.Close();
98             }
99         }

program

这个在program中的文件,程序的入口

时间: 2024-07-31 05:51:35

捕获异常 winform的相关文章

winform学习日志(二十三)---------------socket(TCP)发送文件

一:由于在上一个随笔的基础之上拓展的所以直接上代码,客户端: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Net.Sockets; using Sys

编写高质量代码改善C#程序的157个建议——建议87:区分WPF和WinForm的线程模型

建议87:区分WPF和WinForm的线程模型 WPF和WinForm窗体应用程序都有一个要求,那就是UI元素(如Button.TextBox等)必须由创建它的那个线程进行更新.WinForm在这方面的限制并不是很严格,所以像下面这样的代码,在WinForm中大部分情况下还能运行(本建议后面会详细解释为什么会出现这种现象): private void buttonStartAsync_Click(object sender, EventArgs e) { Task t = new Task(()

C# Winform 跨线程更新UI控件常用方法总结(转)

出处:http://www.tuicool.com/articles/FNzURb 概述 C#Winform编程中,跨线程直接更新UI控件的做法是不正确的,会时常出现“线程间操作无效: 从不是创建控件的线程访问它”的异常.处理跨线程更新Winform UI控件常用的方法有4种: 1. 通过UI线程的SynchronizationContext的Post/Send方法更新: 2. 通过UI控件的Invoke/BegainInvoke方法更新: 3. 通过BackgroundWorker取代Thre

C#使用MiniDump捕获异常

c/c++语言里MiniDump是一个重要的调试手段,他们没有C#/java这样语言有很多异常输出信息( JVM异常导出bug日志功能,通常在jdk目录,文件格式hs_err_%pid%.log,pid是进程id). 我们通常在项目中都会把可预见性进行异常处理.常见的处理方法如下 try{ ... catch(Exception ex) { HandleExeption(ex); } 项目部署到客户机中运行在程序员无法评估的情况下,如(堆栈溢出.访问冲突)则无法处理 或者很难重现这种异常,这给程

[开源]WinForm 控件使用总结

背景 都2019年了,还在用WinForm吗?哈哈,其实我也没在用,都是很多年前一些项目积累,所以代码写的有些屎,之所以开源出来,希望能给大家有所帮助,喜欢的话给 一个Star以资鼓励~: 具体代码:MasterChief 欢迎Star,欢迎Issues: 控件列表 由于比较多,所以这里贴出目录,具体源码就不贴出来,您可以点击链接查看: 设置程序唯一实例运行,捕获异常,捕获退出,获取exe执行文件夹路径 创建用户控件/控件双向绑定 CheckBox CheckedList 彩色控制台输出 Com

C# Winform 跨线程更新UI控件常用方法汇总

C# Winform 跨线程更新UI控件常用方法汇总 概述 C#Winform编程中,跨线程直接更新UI控件的做法是不正确的,会时常出现“线程间操作无效: 从不是创建控件的线程访问它”的异常.处理跨线程更新Winform UI控件常用的方法有4种:1. 通过UI线程的SynchronizationContext的Post/Send方法更新:2. 通过UI控件的Invoke/BeginInvoke方法更新: 3. 通过BackgroundWorker取代Thread执行异步操作:4. 通过设置窗体

.Net WinForm 控件键盘消息处理剖析

在WinForm控件上我们可以看到很多关于键盘消息处理的方法,比如OnKeyDown, OnKeyPress, ProcessCmdKey, ProcessDialogKey,IsInputKey等等,那么这些方法是如何被组织的,每一个方法的具体含义又是什么哪?Win32的键盘消息又是如何到达控件上的这些方法的,本文将着重阐述这些问题,对.Net WinForm控件的键盘消息处理过程进行剖析.  1.      WinForm消息循环 大家都知道WinForm也是依赖于底层的消息机制的,通常我们

Winform软件,不要在线程里操作UI

对于Winform软件,不要在线程里操作UI,不要相信:StartForm.CheckForIllegalCrossThreadCalls = false; 于是,把所有的代码都改成主线程委托调用的方式 private delegate void SetTextHandle(string id, string value); private void ThreadSetText(string id, string value) { this.Controls.Find(id, true)[0].

WinForm 多窗体、菜单和工具栏

今天,我首先先学习了一下在WinForm程序开发中常遇到的问题——多窗体程序运行问题. 在开发多窗体程序时,常会遇到以下四个方面的问题: 一.哪个是主窗体 问题:主窗体隐藏了,关闭其它窗体后,没有将主窗体显示/关闭,那么程序就关不上了. 当遇到这个问题时,我们通常的解决办法是:构造函数传值,将窗体传到另一个窗体中去,进行关闭. 二.窗体只能打开一个 创建一个全局的泛型集合,为了放置全部打开的窗体.在窗体打开之前,判断集合中是否有name一致的窗体,如果有就说明已经打开了,就不要再打开了. 问题: