3rd Party Library 错误导致 Release 挂起
Error in 3rd Party Library Causing Hanging in Release
我的主程序是一个 ASP.Net 核心 Web API,它在托管服务中有一个第三方库。第三方库初始化正常,但在其整个生命周期中有时会抛出一些错误。
它提供了一种通过事件连接到对象的方法,并且会让我知道错误是什么,以便我可以处理它但是它仍然会在第三方中抛出图书馆..
由于我是自己处理事件,所以我想完全忽略这个库中发生的这些错误。无论如何我可以做到吗?
我已经尝试添加一个全局异常处理程序,奇怪的是,这个异常处理程序永远不会被命中。我可以获得异常的唯一方法是将我的异常设置设置为在 CLR 异常发生时中断,如上图所示
这不会使我的程序崩溃。由于某种原因,该程序只是挂起。当我在“抛出时中断”window 中关闭 CLR 异常时,程序 运行 就好了。这几乎就像 visual studio 正在做一些特殊的事情来处理控制台版本无法做到的这些类型的异常
我似乎可以获得这个 运行ning 的控制台版本的唯一方法是将 visual studio 调试器附加到进程,当异常被触发时,按下绿色播放按钮visual studio 中的“继续”。否则应用程序似乎只是挂在第三方库抛出的异常上。
只要附加了 visual studio 且未检查 CLR 中断异常,应用程序就会 运行 正常
有谁知道如何确保这些类型的异常在发布时不会挂起程序?
附加信息:
- 第三方库是 .NET Framework 4 库
- Asp.Net 项目的目标是“net5.0-windows”
- 第 3 方 class 可能正在使用多线程
如果有帮助,这就是我创建第三方的方式class
发布代码中处理NullReferenceException(官方建议)
避免 NullReferenceException 通常比在它发生后进行处理更好。处理异常会使您的代码更难维护和理解,有时还会引入其他错误。 NullReferenceException 通常是不可恢复的错误。在这些情况下,让异常停止应用程序可能是最好的选择。
但是,在很多情况下处理错误是有用的:
1.Your 应用可以忽略为空的对象。例如,如果您的应用程序检索和处理数据库中的记录,您可能能够忽略一些导致空对象的错误记录。在日志文件或应用程序中记录错误数据 UI 可能是您所要做的全部。
2.You 可以从异常中恢复。例如,如果连接丢失或连接超时,对 return 引用类型的 Web 服务的调用可能 return 为空。您可以尝试重新建立连接并再次尝试呼叫。
3.You 可以将您的应用程序状态恢复到有效状态。例如,您可能正在执行一项多步骤任务,要求您在调用抛出 NullReferenceException 的方法之前将信息保存到数据存储中。如果未初始化的对象会破坏数据记录,您可以在关闭应用程序之前删除以前的数据。
4.You想报告异常。例如,如果错误是由您的应用程序用户的错误引起的,您可以生成一条消息来帮助他们提供正确的信息。您还可以记录有关错误的信息以帮助您解决问题。一些框架,比如 ASP.NET,有一个高级异常处理程序,可以捕获应用程序永远不会崩溃的所有错误;在这种情况下,记录异常可能是您知道异常发生的唯一方法。
因此,经过几天的研究,我终于找到了一个可以挂钩的事件,无论您进入线程的深度如何,都可以从 任何 来源向您提供错误消息。
AppDomain.CurrentDomain.FirstChanceException += CurrentDomain_FirstChanceException;
连接到此事件将使您能够看到来自每个库和每个线程的错误。只需将上面的内容放入您 program.cs(或您拥有的任何启动文件),您就会神奇地被来自您认为曾经完美无缺的所有 3rd 方库的所有未知错误淹没。
private static void CurrentDomain_FirstChanceException(object sender, System.Runtime.ExceptionServices.FirstChanceExceptionEventArgs e)
{
Console.WriteLine(e.Exception.Message, e.Exception.StackTrace);
}
我已经用下面的方法完成了,瞧瞧。第三方库试图以不安全的方式引用另一个项目并引发错误。因为我不需要这个其他项目引用,所以构建的 exe 没有引用这个程序集,因为我在项目中没有直接引用它(该死的需要优化一切的聪明人).我能够正确 运行 是因为在我的 visual studio 解决方案中,我引用了另一个项目。因此,一旦 visual studio 通过某种黑魔法连接到调试器,第三方库就会开始使用它。
无论如何,我制作了一个使用所需项目的一次性对象,问题已解决。
我真的希望这对其他人有帮助,并为他们节省我找到它所花费的时间。
我的主程序是一个 ASP.Net 核心 Web API,它在托管服务中有一个第三方库。第三方库初始化正常,但在其整个生命周期中有时会抛出一些错误。
它提供了一种通过事件连接到对象的方法,并且会让我知道错误是什么,以便我可以处理它但是它仍然会在第三方中抛出图书馆..
由于我是自己处理事件,所以我想完全忽略这个库中发生的这些错误。无论如何我可以做到吗?
我已经尝试添加一个全局异常处理程序,奇怪的是,这个异常处理程序永远不会被命中。我可以获得异常的唯一方法是将我的异常设置设置为在 CLR 异常发生时中断,如上图所示
这不会使我的程序崩溃。由于某种原因,该程序只是挂起。当我在“抛出时中断”window 中关闭 CLR 异常时,程序 运行 就好了。这几乎就像 visual studio 正在做一些特殊的事情来处理控制台版本无法做到的这些类型的异常
我似乎可以获得这个 运行ning 的控制台版本的唯一方法是将 visual studio 调试器附加到进程,当异常被触发时,按下绿色播放按钮visual studio 中的“继续”。否则应用程序似乎只是挂在第三方库抛出的异常上。
只要附加了 visual studio 且未检查 CLR 中断异常,应用程序就会 运行 正常
有谁知道如何确保这些类型的异常在发布时不会挂起程序?
附加信息:
- 第三方库是 .NET Framework 4 库
- Asp.Net 项目的目标是“net5.0-windows”
- 第 3 方 class 可能正在使用多线程
如果有帮助,这就是我创建第三方的方式class
发布代码中处理NullReferenceException(官方建议)
避免 NullReferenceException 通常比在它发生后进行处理更好。处理异常会使您的代码更难维护和理解,有时还会引入其他错误。 NullReferenceException 通常是不可恢复的错误。在这些情况下,让异常停止应用程序可能是最好的选择。
但是,在很多情况下处理错误是有用的:
1.Your 应用可以忽略为空的对象。例如,如果您的应用程序检索和处理数据库中的记录,您可能能够忽略一些导致空对象的错误记录。在日志文件或应用程序中记录错误数据 UI 可能是您所要做的全部。
2.You 可以从异常中恢复。例如,如果连接丢失或连接超时,对 return 引用类型的 Web 服务的调用可能 return 为空。您可以尝试重新建立连接并再次尝试呼叫。
3.You 可以将您的应用程序状态恢复到有效状态。例如,您可能正在执行一项多步骤任务,要求您在调用抛出 NullReferenceException 的方法之前将信息保存到数据存储中。如果未初始化的对象会破坏数据记录,您可以在关闭应用程序之前删除以前的数据。
4.You想报告异常。例如,如果错误是由您的应用程序用户的错误引起的,您可以生成一条消息来帮助他们提供正确的信息。您还可以记录有关错误的信息以帮助您解决问题。一些框架,比如 ASP.NET,有一个高级异常处理程序,可以捕获应用程序永远不会崩溃的所有错误;在这种情况下,记录异常可能是您知道异常发生的唯一方法。
因此,经过几天的研究,我终于找到了一个可以挂钩的事件,无论您进入线程的深度如何,都可以从 任何 来源向您提供错误消息。
AppDomain.CurrentDomain.FirstChanceException += CurrentDomain_FirstChanceException;
连接到此事件将使您能够看到来自每个库和每个线程的错误。只需将上面的内容放入您 program.cs(或您拥有的任何启动文件),您就会神奇地被来自您认为曾经完美无缺的所有 3rd 方库的所有未知错误淹没。
private static void CurrentDomain_FirstChanceException(object sender, System.Runtime.ExceptionServices.FirstChanceExceptionEventArgs e)
{
Console.WriteLine(e.Exception.Message, e.Exception.StackTrace);
}
我已经用下面的方法完成了,瞧瞧。第三方库试图以不安全的方式引用另一个项目并引发错误。因为我不需要这个其他项目引用,所以构建的 exe 没有引用这个程序集,因为我在项目中没有直接引用它(该死的需要优化一切的聪明人).我能够正确 运行 是因为在我的 visual studio 解决方案中,我引用了另一个项目。因此,一旦 visual studio 通过某种黑魔法连接到调试器,第三方库就会开始使用它。
无论如何,我制作了一个使用所需项目的一次性对象,问题已解决。
我真的希望这对其他人有帮助,并为他们节省我找到它所花费的时间。