许多小公司的项目都缺少异常处理模块,我们也是。经常会出现这种情况,用户在UI界面操作,就直接跳出堆栈调用的异常信息对话框,老板看到那叫一个火啊!你们的代码怎么天天出现乱码。呵呵!这就是没有异常捕获处理导致的,现在许多人写代码都没意识处理异常,只要实现功能就好,我的许多组员也是如此。
项目刚接手,所以打算做一个异常全局捕获,统一处理的模式,采用具体详细信息的对话框提醒与日志文件保存方式。以下是根据网上找的C#winform全局异常捕获做了点修改。(等项目异常处理全部完成后,将心得体会做个记录,此处暂对全局异常捕获做个记录)
1
static
class
Program
2
{
3
///
<summary>
4
///
应用程序的主入口点。
5
///
</summary>
6
[STAThread]
7
static
void
Main()
8
{
9
try
10
{
11
//
设置应用程序处理异常方式:ThreadException处理
12
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
13
//
处理UI线程异常
14
Application.ThreadException +=
new
System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
15
//
处理非UI线程异常
16
AppDomain.CurrentDomain.UnhandledException +=
new
UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
17
18
#region
应用程序的主入口点
19
Application.EnableVisualStyles();
20
Application.SetCompatibleTextRenderingDefault(
false
);
21
Application.Run(
new
Form1());
22
#endregion
23
}
24
catch
(Exception ex)
25
{
26
string
str = GetExceptionMsg(ex,
string
.Empty);
27
MessageBox.Show(str,
"
系统错误
"
, MessageBoxButtons.OK, MessageBoxIcon.Error);
28
}
29
}
30
31
32
static
void
Application_ThreadException(
object
sender, System.Threading.ThreadExceptionEventArgs e)
33
{
34
string
str =
GetExceptionMsg(e.Exception, e.ToString());
35
MessageBox.Show(str,
"
系统错误
"
, MessageBoxButtons.OK, MessageBoxIcon.Error);
36
//
LogManager.WriteLog(str);
37
}
38
39
static
void
CurrentDomain_UnhandledException(
object
sender, UnhandledExceptionEventArgs e)
40
{
41
string
str = GetExceptionMsg(e.ExceptionObject
as
Exception, e.ToString());
42
MessageBox.Show(str,
"
系统错误
"
, MessageBoxButtons.OK, MessageBoxIcon.Error);
43
//
LogManager.WriteLog(str);
44
}
45
46
///
<summary>
47
///
生成自定义异常消息
48
///
</summary>
49
///
<param name="ex">
异常对象
</param>
50
///
<param name="backStr">
备用异常消息:当ex为null时有效
</param>
51
///
<returns>
异常字符串文本
</returns>
52
static
string
GetExceptionMsg(Exception ex,
string
backStr)
53
{
54
StringBuilder sb =
new
StringBuilder();
55
sb.AppendLine(
"
****************************异常文本****************************
"
);
56
sb.AppendLine(
"
【出现时间】:
"
+
DateTime.Now.ToString());
57
if
(ex !=
null
)
58
{
59
sb.AppendLine(
"
【异常类型】:
"
+
ex.GetType().Name);
60
sb.AppendLine(
"
【异常信息】:
"
+
ex.Message);
61
sb.AppendLine(
"
【堆栈调用】:
"
+
ex.StackTrace);
62
}
63
else
64
{
65
sb.AppendLine(
"
【未处理异常】:
"
+
backStr);
66
}
67
sb.AppendLine(
"
***************************************************************
"
);
68
return
sb.ToString();
69
}
70
}
参考:
1
static
class
Program
2
{
3
///
<summary>
4
///
应用程序的主入口点。
5
///
</summary>
6
[STAThread]
7
static
void
Main()
8
{
9
try
10
{
11
//
处理未捕获的异常
12
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
13
//
处理UI线程异常
14
Application.ThreadException +=
new
System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
15
//
处理非UI线程异常
16
AppDomain.CurrentDomain.UnhandledException +=
new
UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
17
18
#region
应用程序的主入口点
19
20
Application.EnableVisualStyles();
21
Application.SetCompatibleTextRenderingDefault(
false
);
22
Application.Run(
new
Main());
23
24
#endregion
25
26
}
27
catch
(Exception ex)
28
{
29
string
str =
""
;
30
string
strDateInfo =
"
出现应用程序未处理的异常:
"
+ DateTime.Now.ToString() +
"
\r\n
"
;
31
32
if
(ex !=
null
)
33
{
34
str =
string
.Format(strDateInfo +
"
异常类型:{0}\r\n异常消息:{1}\r\n异常信息:{2}\r\n
"
,
35
ex.GetType().Name, ex.Message, ex.StackTrace);
36
}
37
else
38
{
39
str =
string
.Format(
"
应用程序线程错误:{0}
"
, ex);
40
}
41
42
//
MessageBox.Show(str, "系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
43
LogManager.WriteLog(str);
44
}
45
46
}
47
48
49
static
void
Application_ThreadException(
object
sender, System.Threading.ThreadExceptionEventArgs e)
50
{
51
string
str =
""
;
52
string
strDateInfo =
"
出现应用程序未处理的异常:
"
+ DateTime.Now.ToString() +
"
\r\n
"
;
53
Exception error = e.Exception
as
Exception;
54
if
(error !=
null
)
55
{
56
str =
string
.Format(strDateInfo +
"
异常类型:{0}\r\n异常消息:{1}\r\n异常信息:{2}\r\n
"
,
57
error.GetType().Name, error.Message, error.StackTrace);
58
}
59
else
60
{
61
str =
string
.Format(
"
应用程序线程错误:{0}
"
, e);
62
}
63
64
//
MessageBox.Show(str, "系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
65
LogManager.WriteLog(str);
66
}
67
68
static
void
CurrentDomain_UnhandledException(
object
sender, UnhandledExceptionEventArgs e)
69
{
70
string
str =
""
;
71
Exception error = e.ExceptionObject
as
Exception;
72
string
strDateInfo =
"
出现应用程序未处理的异常:
"
+ DateTime.Now.ToString() +
"
\r\n
"
;
73
if
(error !=
null
)
74
{
75
str =
string
.Format(strDateInfo +
"
Application UnhandledException:{0};\n\r堆栈信息:{1}
"
, error.Message, error.StackTrace);
76
}
77
else
78
{
79
str =
string
.Format(
"
Application UnhandledError:{0}
"
, e);
80
}
81
82
//
MessageBox.Show(str, "系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
83
LogManager.WriteLog(str);
84
}
85
}

