在Main方法中設置異常的最後一次捕捉

在作Winfrom程序時,有時會遇到一個異常,但是這個異常不知道在什麼地方發生的,程序會自動關閉,而後什麼也沒有了,在網上找到了一種方法,用來捕捉這種異常。oop

出現這種狀況的緣由是在程序中某些地方考慮不周全,有異常的狀況沒有考慮到,可是CLR不會在出錯時給出提示(注:有些錯誤沒有捕捉的話會自動彈出錯誤框,讓用戶選擇關閉程序仍是繼續),因此就出了事了。。。spa

這時有一種方法來獲得這種異常:線程

 1         /// <summary>
 2         /// 應用程序的主入口點。
 3         /// </summary>
 4         [STAThread]
 5         static void Main()
 6         {
 7             Application.EnableVisualStyles();
 8             Application.SetCompatibleTextRenderingDefault(false);
 9             Application.Run(new Form1());
10         }
11 
12         static Program()
13         {
14             AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
15         }
16 
17         static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
18         {
19             string strException = string.Format("{0}發生系統異常。\r\n{1}\r\n", DateTime.Now, e.ExceptionObject.ToString());
20             File.AppendAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "SystemException.log"), strException);
21         }

 這樣就把異常記錄在日誌中了。調試

 

其實此次的紀錄是爲了處理一個讓人煩惱的異常。程序在開始時沒有什麼問題,直到運行兩天後,發生了異常,而且異常是在一個線程中出現的,有部分的提示信息,信息以下:日誌

 1 2014-12-1 14:48:02發生系統異常。
 2 System.Data.RowNotInTableException: 此行已從表中移除而且沒有任何數據。BeginEdit() 將容許在此行中建立新數據
 3    在 System.Data.DataRow.GetDefaultRecord()
 4    在 System.Data.DataRow.get_Item(Int32 columnIndex)
 5    在 異常處理.Form1.DemonstrateRowNotInTableException()
 6    在 System.Threading.ThreadHelper.ThreadStart_Context(Object state)
 7    在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
 8    在 System.Threading.ThreadHelper.ThreadStart()
 9    在 System.Data.DataRow.GetDefaultRecord()
10    在 System.Data.DataRow.get_Item(Int32 columnIndex)
11    在 異常處理.Form1.DemonstrateRowNotInTableException()
12    在 System.Threading.ThreadHelper.ThreadStart_Context(Object state)
13    在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
14    在 System.Threading.ThreadHelper.ThreadStart()捕捉開始:

沒有說明錯誤在哪一行,也沒有彈出出錯對話框,這是有緣由的。code

沒有彈出錯誤對話框的緣由:orm

  在通常狀況下,若是出現了錯誤,會出現像下面的對話框。blog

錯誤提示

  線程中不會出現異常對話框。這個深刻的緣由我也不知道,但願有明白此緣由的能解釋一下。get

沒有提示錯誤的所在行緣由:string

  在編譯程序後,通常會有一個.pdb文件,這個就是調試使用的信息文件,裏面保存了各類和調試有關的信息。在運行程序時,此文件被刪除掉(我刪除掉的緣由就是在別人使用時不須要有調試這一步)的話,錯誤就不會精確到哪一行。添加上此文件,錯誤會出現具體的所在行。另,若是是Released程序,異常所在行提示不太準確,這個緣由我也是不知道,在Debug下提示的行數是很是精確的。若是有人知道這個緣由的話,但願也說一下,萬分感謝!!

 1 2014-12-1 15:08:44發生系統異常。
 2 System.Data.RowNotInTableException: 此行已從表中移除而且沒有任何數據。BeginEdit() 將容許在此行中建立新數據
 3    在 System.Data.DataRow.GetDefaultRecord()
 4    在 System.Data.DataRow.get_Item(Int32 columnIndex)
 5    在 異常處理.Form1.DemonstrateRowNotInTableException() 位置 \C#\Project\異常處理\異常處理\Form1.cs:行號 63
 6    在 異常處理.Form1.button2_Click(Object sender, EventArgs e) 位置 \C#\Project\異常處理\異常處理\Form1.cs:行號 38
 7    在 System.Windows.Forms.Control.OnClick(EventArgs e)
 8    在 System.Windows.Forms.Button.OnClick(EventArgs e)
 9    在 System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
10    在 System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
11    在 System.Windows.Forms.Control.WndProc(Message& m)
12    在 System.Windows.Forms.ButtonBase.WndProc(Message& m)
13    在 System.Windows.Forms.Button.WndProc(Message& m)
14    在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
15    在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
16    在 System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
17    在 System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
18    在 System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
19    在 System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
20    在 System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
21    在 System.Windows.Forms.Application.Run(Form mainForm)

上面是在Debug下進行調試獲得的信息。有提示行。

相關文章
相關標籤/搜索