2016-02-05 106 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是管理各种线程并处理这种情况下的控制流。