2011-09-16 45 views
0

大家爲什麼Program.Main不會出現在崩潰堆棧

我寫處理主程序所有捕獲的異常C#應用程序:

static void Main() 
    { 
     try 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      Application.Run(new MainFrame());      
     } 
     catch (Exception e) 
     { 
      CrashReporter.Report(e); 
     } 
    } 

,當我運行的應用程序(甚至發佈版本)從視覺工作室它的作品。 但是,當我將它發佈爲click-once並安裝時,在大多數情況下,這些異常不會被捕獲到Main函數中。異常堆棧是這樣的:

... 
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 

即,主要是不在堆棧中... 爲什麼會發生這種情況? 有什麼辦法可以做到這一點'抓住所有'的事情? 爲什麼發佈與本地構建行爲不同?


在此先感謝 塞爾

回答

2

要回答你的有沒有辦法做到這樣的'全部抓住'的事情?問題,請AppDomain.UnhandledException

此事件提供未捕獲異常的通知。它允許應用程序在系統默認處理程序向用戶報告異常並終止應用程序之前記錄有關異常的信息。如果有足夠的關於應用程序狀態的信息可用,則可以採取其他措施 - 例如保存程序數據以供以後恢復。建議謹慎,因爲如果未處理異常,程序數據可能會損壞。 ...

Application.ThreadException事件。

此事件允許您的Windows窗體應用程序處理Windows窗體線程中發生的其他未處理的異常。將您的事件處理程序附加到ThreadException事件中,以處理這些異常,這將使您的應用程序處於未知狀態。在可能的情況下,異常應該由結構化的異常處理塊來處理。 ...

2

我想到的是,異常被拋出不能在主線程。

顯然,其他線程在堆棧中沒有Main(因爲線程函數是它們的入口點)。

由於您正在獲取「nativewindow」回調,這意味着本機窗口正在不同的線程上運行。如果您需要代碼在一個線程上運行,您可能需要使用消息傳遞或使用「調用」來中繼回調。

0

的異常被拋出在一個窗口中的回調;這些是在事件派發線程上調用的。您看到的堆棧跟蹤來自該線程,而不是程序啓動時的主要跟蹤。