簡體   English   中英

在沒有catch塊的情況下捕獲異常

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM