在项目完成初期,用户使用不可避免的会发生错误或者异常,
如何使开发人员更及时更准确地获得用户使用的情况,
会对项目质量,进度,客户满意程度产生不小的影响。
所以,我想实现这样一个功能,当程序执行中,捕获异常,
将异常信息和发生异常的位置,通过Email即时发送给开发人员。
目前实现了基本的功能,但是,存在一点问题,用户使用中,
没有理由把发送email的时间也由用户来负担。
那么通过哪种处理方式可以更合理呢?
下面是现在完成的部分,只有记录日志和发送邮件的部分..(发送邮件只做完了不需要验证的smtp部分.).
1.记录日志 如果发送邮件失败,记录未发送的异常信息.
1![](/Images/OutliningIndicators/None.gif)
2
/// <summary>
3
/// Record info to path
4
/// </summary>
5
internal class LogWriter
6
{
7
structure
23![](/Images/OutliningIndicators/InBlock.gif)
24
private string m_path = "";
25![](/Images/OutliningIndicators/InBlock.gif)
26
/// <summary>
27
/// Record normal info
28
/// </summary>
29
/// <param name="message"></param>
30
internal void WriteInfo(string message)
31
{
32
StreamWriter msgWriter = new StreamWriter(m_path, true, System.Text.Encoding.Default);
33![](/Images/OutliningIndicators/InBlock.gif)
34
msgWriter.WriteLine(DateTime.Now + ":" + message + "\r\n");
35![](/Images/OutliningIndicators/InBlock.gif)
36
msgWriter.Flush();
37
msgWriter.Close();
38
msgWriter.Dispose();
39
}
40
41
/// <summary>
42
/// Record exception info
43
/// </summary>
44
/// <param name="ex"></param>
45
internal void WriteInfo(Exception ex)
46
{
47
string eString = ex.ToString();
48
WriteInfo(eString);
49
}
50
51
/// <summary>
52
/// Validate the filePath available..
53
/// </summary>
54
/// <param name="path"></param>
55
internal void ValidatePath(string path)
56
{
57
if (!File.Exists(path))
58
{
59
FileStream fs = new FileStream(path, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);
60![](/Images/OutliningIndicators/InBlock.gif)
61
fs.Flush();
62
fs.Close();
63
fs.Dispose();
64
}
65
}
66
}
67![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
3
![](/Images/OutliningIndicators/InBlock.gif)
4
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
5
![](/Images/OutliningIndicators/None.gif)
6
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
7
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
23
![](/Images/OutliningIndicators/InBlock.gif)
24
![](/Images/OutliningIndicators/InBlock.gif)
25
![](/Images/OutliningIndicators/InBlock.gif)
26
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
27
![](/Images/OutliningIndicators/InBlock.gif)
28
![](/Images/OutliningIndicators/InBlock.gif)
29
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
30
![](/Images/OutliningIndicators/InBlock.gif)
31
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
32
![](/Images/OutliningIndicators/InBlock.gif)
33
![](/Images/OutliningIndicators/InBlock.gif)
34
![](/Images/OutliningIndicators/InBlock.gif)
35
![](/Images/OutliningIndicators/InBlock.gif)
36
![](/Images/OutliningIndicators/InBlock.gif)
37
![](/Images/OutliningIndicators/InBlock.gif)
38
![](/Images/OutliningIndicators/InBlock.gif)
39
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
40
![](/Images/OutliningIndicators/InBlock.gif)
41
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
42
![](/Images/OutliningIndicators/InBlock.gif)
43
![](/Images/OutliningIndicators/InBlock.gif)
44
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
45
![](/Images/OutliningIndicators/InBlock.gif)
46
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
47
![](/Images/OutliningIndicators/InBlock.gif)
48
![](/Images/OutliningIndicators/InBlock.gif)
49
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
50
![](/Images/OutliningIndicators/InBlock.gif)
51
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
52
![](/Images/OutliningIndicators/InBlock.gif)
53
![](/Images/OutliningIndicators/InBlock.gif)
54
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
55
![](/Images/OutliningIndicators/InBlock.gif)
56
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
57
![](/Images/OutliningIndicators/InBlock.gif)
58
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
59
![](/Images/OutliningIndicators/InBlock.gif)
60
![](/Images/OutliningIndicators/InBlock.gif)
61
![](/Images/OutliningIndicators/InBlock.gif)
62
![](/Images/OutliningIndicators/InBlock.gif)
63
![](/Images/OutliningIndicators/InBlock.gif)
64
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
65
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
66
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
67
![](/Images/OutliningIndicators/None.gif)
2.通过email发送异常信息.先检查记录位置是否有未发送信息,如果有,发送.
1![](/Images/OutliningIndicators/None.gif)
2
/// <summary>
3
/// Class for email Exception info to developer..
4
/// </summary>
5
public class ExceptionMail
6
{
7
structure
15![](/Images/OutliningIndicators/InBlock.gif)
16
// Get file path from configuration
17
static readonly private string logPath = ConfigurationManager.AppSettings["logPath"];
18![](/Images/OutliningIndicators/InBlock.gif)
19
// SmtpClient object to send email
20
private SmtpClient mailSender = new SmtpClient("smtp.?????.com", 25);
21
22
/// <summary>
23
/// Send message by email
24
/// </summary>
25
/// <param name="subject">subject of email</param>
26
/// <param name="message">content of email</param>
27
/// <returns></returns>
28
public bool SendMail(string subject, string message)
29
{
30
SendUnsettled();
31![](/Images/OutliningIndicators/InBlock.gif)
32
AuthorizeSmtp(mailSender);
33![](/Images/OutliningIndicators/InBlock.gif)
34
try
35
{
36
mailSender.Send("XXXXX@XXXXX.com", "XXXXX@XXXXX.com", subject + DateTime.Now.ToString(), message);
37![](/Images/OutliningIndicators/InBlock.gif)
38
return true;
39
}
40
catch
41
{
42
LogWriter.CreateInstance(logPath).WriteInfo(message);
43![](/Images/OutliningIndicators/InBlock.gif)
44
return false;
45
}
46
}
47
48
/// <summary>
49
/// Send exception by email
50
/// </summary>
51
/// <param name="exception">Exception that would be sent</param>
52
/// <returns></returns>
53
public bool SendException(Exception exception)
54
{
55
SendUnsettled();
56![](/Images/OutliningIndicators/InBlock.gif)
57
AuthorizeSmtp(mailSender);
58![](/Images/OutliningIndicators/InBlock.gif)
59
string errorInfo = "Message:" + exception.Message + "\r\n" + "Detail:" + exception.ToString();
60![](/Images/OutliningIndicators/InBlock.gif)
61
try
62
{
63
mailSender.Send("XXXXX@XXXXX.com", "XXXXX@XXXXX.com", "Exception:" + DateTime.Now.ToString(),
64![](/Images/OutliningIndicators/InBlock.gif)
65
errorInfo);
66![](/Images/OutliningIndicators/InBlock.gif)
67
return true;
68
}
69
catch
70
{
71
LogWriter.CreateInstance(logPath).WriteInfo(errorInfo);
72
return false;
73
}
74
}
75
76
/// <summary>
77
/// Add credential to make sender authorized
78
/// </summary>
79
/// <param name="smtp">sender</param>
80
private void AuthorizeSmtp(SmtpClient smtp)
81
{
82
smtp.Credentials = new NetworkCredential("?????", "?????");
83![](/Images/OutliningIndicators/InBlock.gif)
84
smtp.UseDefaultCredentials = true;
85![](/Images/OutliningIndicators/InBlock.gif)
86
smtp.Timeout = 10000;
87![](/Images/OutliningIndicators/InBlock.gif)
88
smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
89
}
90
91
/// <summary>
92
/// Deal with message unsettled
93
/// </summary>
94
private void SendUnsettled()
95
{
96
if (File.Exists(logPath))
97
{
98
StreamReader logReader = new StreamReader(logPath, System.Text.Encoding.Default);
99![](/Images/OutliningIndicators/InBlock.gif)
100
string message = "";
101![](/Images/OutliningIndicators/InBlock.gif)
102
if (logReader.Peek() >= 0)
103
{
104
message += logReader.ReadLine() + "\r\n";
105
}
106![](/Images/OutliningIndicators/InBlock.gif)
107
SendMail("Unsettled Log", message);
108![](/Images/OutliningIndicators/InBlock.gif)
109
logReader.Close();
110
logReader.Dispose();
111
logReader = null;
112
File.Delete(logPath);
113
}
114
}
115
}
116![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
3
![](/Images/OutliningIndicators/InBlock.gif)
4
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
5
![](/Images/OutliningIndicators/None.gif)
6
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
7
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
15
![](/Images/OutliningIndicators/InBlock.gif)
16
![](/Images/OutliningIndicators/InBlock.gif)
17
![](/Images/OutliningIndicators/InBlock.gif)
18
![](/Images/OutliningIndicators/InBlock.gif)
19
![](/Images/OutliningIndicators/InBlock.gif)
20
![](/Images/OutliningIndicators/InBlock.gif)
21
![](/Images/OutliningIndicators/InBlock.gif)
22
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
23
![](/Images/OutliningIndicators/InBlock.gif)
24
![](/Images/OutliningIndicators/InBlock.gif)
25
![](/Images/OutliningIndicators/InBlock.gif)
26
![](/Images/OutliningIndicators/InBlock.gif)
27
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
28
![](/Images/OutliningIndicators/InBlock.gif)
29
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
30
![](/Images/OutliningIndicators/InBlock.gif)
31
![](/Images/OutliningIndicators/InBlock.gif)
32
![](/Images/OutliningIndicators/InBlock.gif)
33
![](/Images/OutliningIndicators/InBlock.gif)
34
![](/Images/OutliningIndicators/InBlock.gif)
35
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
36
![](/Images/OutliningIndicators/InBlock.gif)
37
![](/Images/OutliningIndicators/InBlock.gif)
38
![](/Images/OutliningIndicators/InBlock.gif)
39
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
40
![](/Images/OutliningIndicators/InBlock.gif)
41
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
42
![](/Images/OutliningIndicators/InBlock.gif)
43
![](/Images/OutliningIndicators/InBlock.gif)
44
![](/Images/OutliningIndicators/InBlock.gif)
45
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
46
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
47
![](/Images/OutliningIndicators/InBlock.gif)
48
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
49
![](/Images/OutliningIndicators/InBlock.gif)
50
![](/Images/OutliningIndicators/InBlock.gif)
51
![](/Images/OutliningIndicators/InBlock.gif)
52
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
53
![](/Images/OutliningIndicators/InBlock.gif)
54
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
55
![](/Images/OutliningIndicators/InBlock.gif)
56
![](/Images/OutliningIndicators/InBlock.gif)
57
![](/Images/OutliningIndicators/InBlock.gif)
58
![](/Images/OutliningIndicators/InBlock.gif)
59
![](/Images/OutliningIndicators/InBlock.gif)
60
![](/Images/OutliningIndicators/InBlock.gif)
61
![](/Images/OutliningIndicators/InBlock.gif)
62
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
63
![](/Images/OutliningIndicators/InBlock.gif)
64
![](/Images/OutliningIndicators/InBlock.gif)
65
![](/Images/OutliningIndicators/InBlock.gif)
66
![](/Images/OutliningIndicators/InBlock.gif)
67
![](/Images/OutliningIndicators/InBlock.gif)
68
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
69
![](/Images/OutliningIndicators/InBlock.gif)
70
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
71
![](/Images/OutliningIndicators/InBlock.gif)
72
![](/Images/OutliningIndicators/InBlock.gif)
73
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
74
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
75
![](/Images/OutliningIndicators/InBlock.gif)
76
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
77
![](/Images/OutliningIndicators/InBlock.gif)
78
![](/Images/OutliningIndicators/InBlock.gif)
79
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
80
![](/Images/OutliningIndicators/InBlock.gif)
81
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
82
![](/Images/OutliningIndicators/InBlock.gif)
83
![](/Images/OutliningIndicators/InBlock.gif)
84
![](/Images/OutliningIndicators/InBlock.gif)
85
![](/Images/OutliningIndicators/InBlock.gif)
86
![](/Images/OutliningIndicators/InBlock.gif)
87
![](/Images/OutliningIndicators/InBlock.gif)
88
![](/Images/OutliningIndicators/InBlock.gif)
89
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
90
![](/Images/OutliningIndicators/InBlock.gif)
91
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
92
![](/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
93
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
94
![](/Images/OutliningIndicators/InBlock.gif)
95
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
96
![](/Images/OutliningIndicators/InBlock.gif)
97
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
98
![](/Images/OutliningIndicators/InBlock.gif)
99
![](/Images/OutliningIndicators/InBlock.gif)
100
![](/Images/OutliningIndicators/InBlock.gif)
101
![](/Images/OutliningIndicators/InBlock.gif)
102
![](/Images/OutliningIndicators/InBlock.gif)
103
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
104
![](/Images/OutliningIndicators/InBlock.gif)
105
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
106
![](/Images/OutliningIndicators/InBlock.gif)
107
![](/Images/OutliningIndicators/InBlock.gif)
108
![](/Images/OutliningIndicators/InBlock.gif)
109
![](/Images/OutliningIndicators/InBlock.gif)
110
![](/Images/OutliningIndicators/InBlock.gif)
111
![](/Images/OutliningIndicators/InBlock.gif)
112
![](/Images/OutliningIndicators/InBlock.gif)
113
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
114
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
115
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
116
![](/Images/OutliningIndicators/None.gif)
3.暂存未发送emal的日志文件保存路径,在config文件里加入一个logPath配置项保存.
仔细想了想,可以把发送异常的方法作为独立的进程运行,这样就不会在发生异常
的时候阻塞下面的操作.
![](https://www.cnblogs.com/Emoticons/QQ/22.gif)
![](https://www.cnblogs.com/Emoticons/QQ/22.gif)
![](https://www.cnblogs.com/Emoticons/QQ/22.gif)