許多小公司的項目都缺少異常處理模塊,我們也是。經(jīng)常會出現(xiàn)這種情況,用戶在UI界面操作,就直接跳出堆棧調(diào)用的異常信息對話框,老板看到那叫一個火啊!你們的代碼怎么天天出現(xiàn)亂碼。呵呵!這就是沒有異常捕獲處理導(dǎo)致的,現(xiàn)在許多人寫代碼都沒意識處理異常,只要實(shí)現(xiàn)功能就好,我的許多組員也是如此。
項目剛接手,所以打算做一個異常全局捕獲,統(tǒng)一處理的模式,采用具體詳細(xì)信息的對話框提醒與日志文件保存方式。以下是根據(jù)網(wǎng)上找的C#winform全局異常捕獲做了點(diǎn)修改。(等項目異常處理全部完成后,將心得體會做個記錄,此處暫對全局異常捕獲做個記錄)
1
static
class
Program
2
{
3
///
<summary>
4
///
應(yīng)用程序的主入口點(diǎn)。
5
///
</summary>
6
[STAThread]
7
static
void
Main()
8
{
9
try
10
{
11
//
設(shè)置應(yīng)用程序處理異常方式: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
應(yīng)用程序的主入口點(diǎn)
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,
"
系統(tǒng)錯誤
"
, 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,
"
系統(tǒng)錯誤
"
, 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,
"
系統(tǒng)錯誤
"
, MessageBoxButtons.OK, MessageBoxIcon.Error);
43
//
LogManager.WriteLog(str);
44
}
45
46
///
<summary>
47
///
生成自定義異常消息
48
///
</summary>
49
///
<param name="ex">
異常對象
</param>
50
///
<param name="backStr">
備用異常消息:當(dāng)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(
"
【出現(xiàn)時間】:
"
+
DateTime.Now.ToString());
57
if
(ex !=
null
)
58
{
59
sb.AppendLine(
"
【異常類型】:
"
+
ex.GetType().Name);
60
sb.AppendLine(
"
【異常信息】:
"
+
ex.Message);
61
sb.AppendLine(
"
【堆棧調(diào)用】:
"
+
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
///
應(yīng)用程序的主入口點(diǎn)。
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
應(yīng)用程序的主入口點(diǎn)
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 =
"
出現(xiàn)應(yīng)用程序未處理的異常:
"
+ 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(
"
應(yīng)用程序線程錯誤:{0}
"
, ex);
40
}
41
42
//
MessageBox.Show(str, "系統(tǒng)錯誤", 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 =
"
出現(xiàn)應(yīng)用程序未處理的異常:
"
+ 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(
"
應(yīng)用程序線程錯誤:{0}
"
, e);
62
}
63
64
//
MessageBox.Show(str, "系統(tǒng)錯誤", 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 =
"
出現(xiàn)應(yīng)用程序未處理的異常:
"
+ 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, "系統(tǒng)錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
83
LogManager.WriteLog(str);
84
}
85
}
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

