2016-02-05 127 views
1

我正在拋棄ApplicationException s的遺留項目(閱讀:重構不是一個選項)工作。捕捉異常而沒有捕獲塊

throw new ApplicationException(string.Format("More than one type found with the name {0} in {1}", typeName, assemblies)); 

語境

我是一個相對較新的開發。 基本拋出/捕捉異常顯然對我有意義。即使將異常喚醒調用堆棧到不同的catch語句的概念也很直觀。

除此之外,我知道CLR是有能力的。此行特別容易引起混淆(來自this article

將異常傳遞到堆棧,直到應用程序處理它或程序終止。

我在整個解決方案中找不到一個catch語句,這會讓我認爲異常會終止進程,但是我在前端看到了一條錯誤消息 - 進程在運行。

我的調用堆棧的頂部正在旋轉一個新的線程,上面是外部代碼。如果它不是專有的,我會顯示更多的代碼。

Dim installThread As New Thread(CType(Sub() InstallPackageAsyncInner(appsToOverride, package, parameters), Threading.ThreadStart)) 

問題

難道這是紡起來線程死了,父線程是什麼最終傳播錯誤信息,並處理異常?

如果是這樣,這種控制權轉移如何發生在.NET或任何相關技術處理它?

+0

我意識到我可能只是橡皮鴨調試自己,但我仍然會發布這個以防萬一它幫助另一個。 – Matt

+0

只有信息片斷和不相關的瑣事,而所有需要的信息都在發佈指南中非常清楚地列出,例如,一個最小但完整的例子。 –

+1

如果你找不到一個異常處理程序,所有想到的都是有人在appdomain級別註冊了未經處理的異常...在代碼中是否有任何UnhandledException + = new UnhandledExceptionEventHandler? – NDJ

回答

1

如果你在UI上拋出異常,則調用堆棧具有從System.Windows.Forms.NativeWindow.Callback上一個try-catch框架,這通常是UI線程的根:

private IntPtr Callback(IntPtr hWnd, int msg, IntPtr wparam, IntPtr lparam) { 

     // Note: if you change this code be sure to change the 
     // corresponding code in DebuggableCallback below! 

     Message m = Message.Create(hWnd, msg, wparam, lparam); 

     try { 
      if (weakThisPtr.IsAlive && weakThisPtr.Target != null) { 
       WndProc(ref m); 
      } 
      else { 
       DefWndProc(ref m); 
      } 
     } 
     catch (Exception e) { 
      OnThreadException(e); 
     } 
     finally { 
      if (msg == NativeMethods.WM_NCDESTROY) ReleaseHandle(false); 
      if (msg == NativeMethods.WM_UIUNSUBCLASS) ReleaseHandle(true); 
     } 

     return m.Result; 
    } 

從那裏調用Application.ThreadException處理程序。將安裝一個默認處理程序,通知您該異常。之後,異常通常會被吞噬,您的用戶界面有機會繼續運行。

0

異常處理必須發生在AppDomain級別(因爲我正在運行.NET 4.5.1)。

最終,AppDomain是管理各種線程並處理這種情況下的控制流。