捕获没有catch块的异常

时间:2016-02-05 16:27:01

标签: c# .net multithreading exception

我在遗留项目中工作(阅读:重构不是一种选择),即投掷ApplicationException

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

上下文

我是一个相对较新的开发者。 基本抛出/捕获异常明确对我有意义。甚至将调用堆栈冒泡到不同的catch语句的异常概念也很直观。

除此之外,我知道CLR能够...某事。这一行特别令人困惑(来自this article

  

异常向上传递,直到应用程序处理它或程序终止。

我在整个解决方案中找不到一个catch语句,这会让我认为异常会终止进程,但我在前端看到了一条错误消息 - 进程运行。< / p>

我的调用堆栈顶部正在启动一个新线程,上面是外部代码。如果它不是专有的,我会展示更多的代码。

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

问题

旋转的线程是否可能会死亡,而父线程最终会传播错误消息并处理异常?

如果是这样,这种控制权转移如何在.NET或其他相关技术处理?

2 个答案:

答案 0 :(得分: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处理程序。安装了一个默认处理程序,通知您异常。之后,通常会吞下异常,并且您的UI有机会继续运行。

答案 1 :(得分:0)

异常处理必须在AppDomain级别进行(因为我运行的是.NET 4.5.1)。

最终AppDomain管理各种线程并处理此场景中的控制流。