[英]Catching exceptions without a catch block
我正在處理一個拋出ApplicationException
的舊項目(閱讀:重構不是一種選擇)。
throw new ApplicationException(string.Format("More than one type found with the name {0} in {1}", typeName, assemblies));
上下文
我是一個相對較新的開發人員。 基本的拋出/捕獲異常對我明確地有意義。 甚至將調用堆棧冒泡到另一個catch語句的異常概念也很直觀。
除此以外,我知道CLR可以.. 這行特別令人困惑(來自本文 )
異常會在堆棧中傳遞,直到應用程序對其進行處理或程序終止。
我在整個解決方案中找不到單個catch語句,這讓我覺得異常將終止該進程,但是我在前端看到一條錯誤消息-進程繼續運行。
我的調用堆棧的頂部是一個新線程,上面是外部代碼。 如果不是專有的,我會顯示更多代碼。
Dim installThread As New Thread(CType(Sub() InstallPackageAsyncInner(appsToOverride, package, parameters), Threading.ThreadStart))
問題
旋轉的線程是否有可能死亡,而父線程最終是傳播錯誤消息並處理異常的原因?
如果是這樣,控制權的轉移是如何在.NET
或任何相關技術中進行的?
如果在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
處理程序。 已安裝默認處理程序,該處理程序會通知您該異常。 之后,通常會吞下該異常,並且您的UI有機會繼續運行。
異常處理必須在AppDomain級別上進行(因為我正在運行.NET 4.5.1)。
最終,在這種情況下, AppDomain
是管理各種線程並處理控制流的對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.