C++技巧:利用自定义的异常处理重起你的应用程序
当利用.NET结构时,你将执行try/catch块去处理你的应用程序期待的特殊异常。.NET的一个能力是你可以用自定义的异常处理去抓取你的应用程序在运行过程中被抛弃的未被处理的异常。这就允许你可以用控制的方式去终止你的程序和完成任何的程序清除和错误记录。
当一个客户需要应用程序记录不被处理异常和需要自动重起时我就回经常用到这个特征。我将举例说明.NET如何完成这个功能。
1, 首先,创建一个C#应用程序(RestartApp)
2, 加入下面的using声明。
using System.Threading;
3, 加入下面的自定义异常处理类,你可以看到其中只包含两种方法:
· OnThreadException-记录异常,告诉用户应用程序将重起,关闭当前程序,然后重新启动,在下一步你将看到这个方法将如何被自动调用作为结构对异常处理的反应。
· LogException-这是一个简单的记录方法(被OnThreadException调用)将未被处理的异常写到以当前日期为文件名的文件中。
1. // Custom Exception class to catch all "unhandled exceptions"
2. public class CustomExceptionHandler
3. {
4. // Event handler that will be called when an unhandled
5. // exception is caught
6. public void OnThreadException(object sender,
7. ThreadExceptionEventArgs t)
8. {
9. // Log the exception to a file
10. LogException(t.Exception);
11.
12. // Tell the user that the app will restart
13. MessageBox.Show("A Fatal Error was detected and logged.
14. Click the OK button to restart the
15. application",
16. "Fatal Application Error",
17. MessageBoxButtons.OK, MessageBoxIcon.Stop);
18.
19. // Shut down the current app instance
20. Application.Exit();
21.
22. // Restart the app
23. System.Diagnostics.Process.Start(Application.ExecutablePath);
24. }
25.
26. // *Very* simple logging function to write exception details
27. // to disk
28. protected void LogException(Exception e)
29. {
30. DateTime now = System.DateTime.Now;
31. string error = e.Message + "\n\nStack Trace:\n"
32. + e.StackTrace;
33. string filename = String.Format("Log-{0}{1}{2}-{3}{4}
34. {5}.txt",
35. now.Year.ToString(),
36. now.Month.ToString(),
37. now.Day.ToString(),
38. now.Hour, now.Minute,
39. now.Second);
40.
41. StreamWriter stream = null;
42. try
43. {
44. stream = new StreamWriter(filename, false);
45. stream.Write(error);
46. }
47. catch(Exception ex)
48. {
49. MessageBox.Show(ex.Message);
50. }
51. finally
52. {
53. if (null != stream)
54. stream.Close();
55. }
56. }
57. };
当加入自定义异常处理类后,通过将下面两行代码加入到主函数中(在Application.Run前面)使它融入到结构中,当第二行将CustomExceptionHandler.OnThreadException附加到TreadException事件时第一行将实例化先前已定义的类,当一个异常没被处理被抛弃后,OnTreadException将被自动调用。
58. CustomExceptionHandler eh = new CustomExceptionHandler();
59. Application.ThreadException += new System.Threading.
60. ThreadExceptionEventHandler(eh.OnThreadException);