我在遗留项目中工作(阅读:重构不是一种选择),即投掷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
或其他相关技术处理?
答案 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
管理各种线程并处理此场景中的控制流。