AppDomain.UnhandledException 未捕获未处理的异常

2024-03-06

我们有一个 .NET 3.5 程序集 (dll),由 VB6“代理”(exe) 通过 COM 接口执行。 VB6 代码确实调用:

' Ensure that no system dialog comes up when we GPF.
PreviousErrorMode = SetErrorMode(SEM_NOGPFAULTERRORBOX)
SetErrorMode PreviousErrorMode Or SEM_NOGPFAULTERRORBOX

' Assign our Exception Handler for this process.
PreviousExceptionFilter = SetUnhandledExceptionFilter(AddressOf UnhandledExceptionFilter)

还有VB6UnhandledExceptionFilter将异常转换为 VB6 引发的错误。 (但是这里也没有调用它,并且这个 VB6 代码多年来没有被更改,甚至没有重新编译。)

在 VB6 代码创建的第一个 .NET 对象的构造函数中,我添加了一个处理程序AppDomain.CurrentDomain.UnhandledException(并且,在尝试调试这个问题时,我添加了一个Windows.Forms.Application.ThreadException,但这并没有帮助,无论如何我们都没有通过 .NET 显示任何 UI)。

我确信UnhandledException在 VS2008 中开发这段代码时,事件捕获了一些东西,但我不确定我是否在 VS2015 中看到过它。

该代码运行多个线程,其中一些线程正在执行主要目的,其中涉及插入和更新 SQL Server 数据,并且还通过 TCP 协议进行通信,该协议由其他线程处理,包括BackgroundWorker.

那些执行主要目的的创建者是:

taskThread = New Thread(AddressOf EnsureTaskCompletes)
taskThread.SetApartmentState(Threading.ApartmentState.STA)
taskThread.Start()

它太专有和复杂,无法向您展示更多代码,但我在调试此问题时调整了代码以简单地Throw New Exception而不是最终具有相同效果的复杂代码。(*)

这个“简单”异常没有被处理UnhandledExceptionHandler除非我打开了非托管调试,否则就会默默地终止程序。

是否有记录的行为改变AppDomain.CurrentDomain.UnhandledException当.NET Framework“仅”作为 dll 加载时?

(由于COM重新注册,我不想在VS2008中构建以前的版本尚未确认is行为改变。我have确认.NET 3.5Exe由 VS2015 编译,创建一个Thread引发未处理的异常does处理异常UnhandledException event.)

我的解决方法是添加一个Catch到现有的Try Finally in EnusreTaskCompletes已经尝试至少记录线程在任务完成之前终止,并调用UnhandledExceptionHandler myself.

(*实际问题是数据库中缺少一个表,该表仅在信用用完时使用 - 我没有添加该代码或表。这引发了一个异常,但该异常未被捕获UnhandledExceptionHandler,使得调试变得相当困难——SQL Server Profiler终于发现了这个问题。)


这是一个极其广泛的话题,而且速度极快。不,当从 VB6 调用代码时,您永远不会观察到 UnhandledException 事件。跨互操作边界传递异常是严格的verboten.

CLR 遵守规定,它使用 CCW 中的 catch-em-all 异常处理程序来捕获异常。并将其转换为 COM 兼容的 HRESULT 错误代码。每个 .NET 异常都有一个独特的异常.HResult https://msdn.microsoft.com/en-us/library/system.exception.hresult(v=vs.110).aspx适当的价值。

VB6 运行时又将它们转换为 VB6 错误。您需要使用On Error声明抓住他们。 CLR 实现 IErrorInfo 来提供some信息,VB6Err.Number属性具有 Exception.HResult 值和Err.Description为您提供 Exception.Message 属性值。然而你会not获取Holy Stacktrace,如果您需要 InnerException 属性来诊断事故,将会带来严重的不便。考虑使用 AppDomain.FirstChanceException 事件来记录详细信息。

调试这样的异常非常容易。使用项目 > 属性 > 调试 > 启动外部程序单选按钮。选择您编译的 VB6 程序或 VB6 IDE。强制调试器在第一次出现异常时停止,在 VS2015 中使用“调试”>“Windows”>“异常设置”并勾选“公共语言运行时异常”。

请注意,此机制对于您在自己的工作线程上运行的任何代码都无效。在互操作场景中处理这些问题是很棘手的。想必这就是让您对“有时有效”场景感到困惑的原因。

使用 SetUnhandledExceptionFilter() 时一定要非常小心,因为它很容易破坏 .NET 代码。 CLR 也调用该函数来安装自己的处理程序并使用它来引发some例外情况。特别是 NullReferenceException 和 DivideByZeroException,这是 C# 编码的异常类型might想要抓住自己。还有一些非常糟糕的东西,比如 AccessViolationException,你永远不想捕获它。顺便说一句,它也可能会干扰 VB6 错误,运行时还使用 SEH 来引发异常。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AppDomain.UnhandledException 未捕获未处理的异常 的相关文章

  • try-catch 中未处理的异常

    try list from XElement e in d Descendants wix File where e Attribute Name Value Contains temp Name e Parent Parent Attri
  • 为什么密码错误会导致“填充无效且无法删除”?

    我需要一些简单的字符串加密 所以我编写了以下代码 有很多 灵感 来自here http www codeproject com KB security DotNetCrypto aspx create and initialize a cr
  • 过期时自动重新填充缓存

    我当前缓存方法调用的结果 缓存代码遵循标准模式 如果存在 则使用缓存中的项目 否则计算结果 在返回之前将其缓存以供将来调用 我想保护客户端代码免受缓存未命中的影响 例如 当项目过期时 我正在考虑生成一个线程来等待缓存对象的生命周期 然后运行
  • 如何重新启动死线程? [复制]

    这个问题在这里已经有答案了 有哪些不同的可能性可以带来死线程回到可运行状态 如果您查看线程生命周期图像 就会发现一旦线程终止 您就无法返回到新位置 So 没有办法将死线程恢复到可运行状态 相反 您应该创建一个新的 Thread 实例
  • VB - 以隐式方式链接 DLL

    我正在开发 VB6 图形界面 并且需要隐式链接到 DLL 这样做的动机来自于我上一个问题 https stackoverflow com questions 5194573 有问题的 DLL 使用静态 TLS declspec thread
  • 我应该如何缓冲绘制的矩形以提高性能(C#/.NET/WinForms/GDI+)

    我在做什么 我正在开发一个 C NET 4 7 2 WinForms 应用程序 它使用以下命令在表单上绘制大量填充矩形Graphics FillRectangle https learn microsoft com en us dotnet
  • 捕获特定的 WebException (550)

    假设我创建并执行一个System Net FtpWebRequest 我可以用catch WebException ex 捕获此请求引发的任何与 Web 相关的异常 但是 如果我有一些逻辑只想在由于以下原因引发异常时执行 550 file
  • 在 C# 中执行基于存储过程的查询后,如何重新使用 CommandText 的 SqlCommand 对象?

    我有一个示例代码 aCommand CommandType CommandType StoredProcedure aCommand Parameters AddWithValue book id bookID aCommand Param
  • 如何在 sql server 中加密数据并在 .net 应用程序中解密

    我想加密 sql server 中的一些密码并让 c 应用程序解密它们 显然 我可以创建一个 SP 来解密所需的密码并将其传递给 c 应用程序 但这意味着通过网络发送明文密码 因此 我希望能够在 sql server 中加密我的密码 使用密
  • 从 .net 应用程序登录 OpenID 站点

    我一直在考虑编写一个小工具来登录 SO 并定期使用一些主题 当前信息更新我的个人资料信息 例如我最新的博客文章或我需要帮助的问题等 为了让它工作 我需要以某种方式从控制台应用程序登录到SO 是否有一个 Net 库可以简化使用原始 http
  • WPF Datagrid 循环/选择具有特定属性的单元格

    全新的 WPF 对 WinForms 非常熟悉 这可能会让过渡变得更加困难 我正在尝试将旧 WinForms 项目中的一些功能移植到 WPF 中作为学习体验 目标是在 DataGrid 中查找与 TextBox 中的字符串匹配的单元格值 我
  • 删除 TableLayoutPanel 中的特定行

    我有 TableLayoutPanel 我以编程方式添加行 用户基本上选择一个属性 然后与一些控件一起显示在表中 我想我在这里有一个一般性的理解问题 我会尽力解释它 每行中的控件之一是 删除 按钮 该按钮应该删除它所在的行 我所做的是将事件
  • 如何使用AutoMapper按照类中定义的顺序映射对象?

    给定这两个对象 我使用非常不同的对象来更好地阐明 public class Car public string Brand get set public int Speed get set public class Apple public
  • 为什么抽象类应该实现抽象基类的抽象方法?

    在下面的示例中 该类Derived实现抽象方法method从课堂上Main 但我想不出在抽象中填写方法体的理由Derived类的实现 当然 我应该只在实际类中实现抽象方法 那么我怎样才能避免这样做呢 我还可以做些什么 abstract cl
  • 需要从 DCOM 配置中删除对象 (DCOMCNFG)

    我们有一个带有 activex exe 和 com dll 的应用程序 安装后 我们会在 DCOM 配置中创建一个对象 如果我们尝试从 DCOM 配置中删除该对象 它就会关闭 直到我们再次重新打开它 想知道是否有任何程序可以从 DCOM 及
  • 如何转义 HTML 字符?在.NET中-->“

    如何在 NET 中转义 HTML 字符 我正在从 json 字符串中获取 html 并在标题中得到 amp quot more text 看起来我需要做两次才能得到 amp quot 成为 quot 那么它就是一个 如何转义 NET 中的所
  • 使用 NServiceBus FileShareDataBus 时清理文件

    我在 NServiceBus 3 中使用 FileShareDataBus 是否支持清理数据总线文件 如果不是 实现此目的的最佳实践是什么 例如如何确保该文件不是错误队列中消息的一部分 鉴于不可能知道消息在错误队列中停留多长时间 我通常会在
  • pthread_cond_timedwait() 和 pthread_cond_broadcast() 解释

    因此 我在堆栈溢出和其他资源上进行了大量搜索 但我无法理解有关上述函数的一些内容 具体来说 1 当pthread cond timedwait 因为定时器值用完而返回时 它如何自动重新获取互斥锁 互斥锁可能被锁定在其他地方 例如 在生产者
  • 模拟pytest中的异常终止

    我的多线程应用程序遇到了一个错误 主线程的任何异常终止 例如 未捕获的异常或某些信号 都会导致其他线程之一死锁 并阻止进程干净退出 我解决了这个问题 但我想添加一个测试来防止回归 但是 我不知道如何在 pytest 中模拟异常终止 如果我只
  • 将文本叠加在图像背景上并转换为 PDF

    使用 NET 我想以编程方式创建一个 PDF 它仅包含一个背景图像 其上有两个具有不同字体和位置的标签 我已阅读过有关现有 PDF 库的信息 但不知道 如果适用 哪一个对于如此简单的任务来说最简单 有人愿意指导我吗 P D 我不想使用生成的

随机推荐

  • 如何支持/提供免费试用期的 iO​​S 订阅?

    我正在努力改变现有的 iOS 10 应用程序以提供自动续订订阅 虽然 正常 订阅 无介绍性优惠 在我的应用程序和服务器上 收据验证和用户帐户处理 都运行良好 但我很难理解如何提供免费试用期 在 App Store Connect 中设置免费
  • 如何显示长度超过 63 个字符的系统托盘工具提示?

    如何显示长度超过 63 个字符的系统托盘工具提示 NotifyIcon Text 有 63 个字符的限制 但我发现 VNC Server 有更长的工具提示 我怎样才能完成 VNC Server 所做的事情 实际上 这是 Text 属性的属性
  • 臭名昭著的 Visual Studio 错误 C1902,VS 配置

    我在 Visual Studio 2010 中的 VC 构建中遇到了臭名昭著的 错误 C1902 程序数据库管理器不匹配 请检查您的安装 我的 VS 甚至不会构建 hello world 文件夹中甚至不存在 pdb 文件 我尝试过的步骤 清
  • 在 Firestore 中为文档 ID 自定义对象建模的最佳方法是什么?

    假设我有一个 用户 集合 并且很高兴他们的 ID 是生成的 Firestore documentId 如下所示 Users Collection GENERATED FIRESTORE ID1 name User 1 name etc GE
  • 在 C# 中创建 ASN1 编码签名以发送到 Java

    我有一个私人 公共安全证书 我的 Java 同行拥有公钥 我需要获取一个字符串 对其进行签名 然后将其发送到 Java 然后验证数据和签名 微软和世界其他地方如何编码 签名数据似乎存在一个众所周知的问题 即有关字节处理方式的问题 这是众所周
  • 交互式Python - 相对导入的解决方案

    From Python 十亿次相对导入 https stackoverflow com questions 14132789 python relative imports for the billionth time For a from
  • Postgres - 在所有数据库上运行相同的查询(相同的模式)

    希望这是一个非常简单的问题 我有一个简单的 SELECT 查询 内置了一些子查询 我有超过 40 个数据库 我需要对所有数据库 都具有相同的架构 运行此查询并将结果返回到一个大表中 我正在想象一个循环序列 就像javascript的i 0
  • python gui 事件乱序

    from Tkinter import from tkMessageBox import class Gui def init self root self container Frame root self container grid
  • 如何在 Chrome 扩展中使用内容脚本文件注入 CSS?

    我正在尝试从 JavaScript 注入 CSS 它作为内容脚本注入 content scripts matches http www google com js script js I found 类似的问题 https stackove
  • 禁用选项卡布局

    我正在使用设计库提供的新类 TabLayout 我希望在特定情况下我正在使用的标签不能再更改 我设法禁用其视图页面上的滑动 但我不知道如何通过单击选项卡来禁用页面更改 提前致谢 我遇到了同样的问题 我使用以下代码禁用选项卡上的触摸事件来解决
  • Android - 在 Eclipse 中创建新活动 [重复]

    这个问题在这里已经有答案了 简单的一个 我已经阅读了一些指南和教程 它们非常清楚如何开始一项活动 有目的 但是 如何在 Eclipse 中创建新活动 我可能可以手动完成此操作 但随后我必须修改R文件 自动生成 并添加新的 xml 布局 好的
  • pandas 有没有办法将 read_sql() 与 sql 语句一起使用,该语句需要多个变量?

    这是我的代码的一部分 我已经有一个包含值的数据库 并且需要根据该数据帧中的值创建一个新的数据帧 目前这些值只有 12 和 13 存储在header row ids多变的 当我运行脚本时 我收到以下错误消息 pandas io sql Dat
  • 当 Web API 中没有发布数据时,避免使用 null 模型

    这个问题与我想要实现的目标类似 当没有发布的属性与模型匹配时 避免在 ASP Net Web API 中使用 null 模型 https stackoverflow com questions 25160345 avoiding null
  • 每次击键都会调用 api

    我尝试创建这个反应网站 我可以在其中搜索一个地方 我遇到一个问题 因为每当我在搜索框中输入新字母时 就会调用 api 这会使网站非常慢 我不希望它每次击键时都调用 api 我认为这是因为第二个 useEffect 但如果我删除该 useEf
  • 如何更改 LaTeX 中的文档字体?

    如何将整个文档的字体更改为无衬线字体 或其他字体 感谢文森特答案中的链接 我找到了解决方案 renewcommand familydefault sfdefault 这会将默认字体系列更改为无衬线字体
  • 为什么invalidate()之后不调用onDraw?

    我在 stackoverflow 上找到了很多帖子 但仍然无法解决我的问题 这是我的代码片段 public class MyView extends RelativeLayout Button b1 Button b2 Context sC
  • 如何知道用户是否在 Telegram 中看到了我的机器人发送的消息?

    我正在开发一个 Telegram 机器人 我想知道与我的机器人开始私人聊天的用户是否已经看到机器人发送的特定消息 并想知道他什么时候看到的 可以这样做吗 非常感谢 目前这是不可能的
  • 找不到方法:Microsoft.AnalysisServices

    我已经使用 SSIS 包为数据仓库创建了 ETL 设置 一切都工作正常 直到最后一步 即 分析服务处理任务编辑器 每当我添加立方体并按 确定 时 我都会收到以下错误 找不到方法 Void Microsoft AnalysisServices
  • 如何删除 Xcode 9 中标记单词上插入的双引号

    Xcode 9 中的这个新功能seems没问题 但我无法习惯它 而且在大多数情况下 它要求我比旧的本机函数做更多的工作 如何防止 Xcode 引用标记的单词 而不是用单引号替换标记的单词 在这种情况下 当标记单词时Text并击中 我想要的结
  • AppDomain.UnhandledException 未捕获未处理的异常

    我们有一个 NET 3 5 程序集 dll 由 VB6 代理 exe 通过 COM 接口执行 VB6 代码确实调用 Ensure that no system dialog comes up when we GPF PreviousErro