C# 在没有catch块的情况下捕获异常
我在一个遗留项目中工作(阅读:重构不是一个选项),它抛出了C# 在没有catch块的情况下捕获异常,c#,.net,multithreading,exception,C#,.net,Multithreading,Exception,我在一个遗留项目中工作(阅读:重构不是一个选项),它抛出了ApplicationExceptions throw new ApplicationException(string.Format("More than one type found with the name {0} in {1}", typeName, assemblies)); 上下文 我是一个相对较新的开发人员。基本的抛出/捕获异常对我来说很有意义。甚至异常的概念在调用堆栈中冒泡到另一个catch语句也让人感觉很直观 除此之外
ApplicationException
s
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
或任何相关技术中进行的?异常处理必须在AppDomain级别进行(因为我正在运行.NET 4.5.1)
最终,
AppDomain
是在这种情况下管理各种线程和处理控制流的工具。如果您在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;
}
从那里,它调用应用程序.ThreadException
处理程序。将安装一个默认处理程序,通知您该异常。在此之后,异常通常会被忽略,您的UI将有机会继续运行。我意识到我可能只是自己调试了rubber duck,但我仍然会发布此消息,以防它对其他人有所帮助。这里只包含信息片段和无关的琐事,而所有需要的都在发布指南中非常清楚地列出,例如,一个最小但完整的示例。如果找不到单个异常处理程序,我想到的是有人在appdomain级别注册了未处理的异常…代码中是否有未处理的异常+=新的未处理异常venthandler?未处理的异常处理程序或异常是在线程池线程中抛出的,我们正在运行.net 4.5。是的,这是一个非常模糊的问题,但是像“在appdomain级别注册未处理的异常”这样的东西至少给了我一些我可以在google上搜索到的东西。谢谢@NDJ!我将结束这个问题,因为我无法明确回答我的问题