- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们有一个 .NET 3.5 程序集 (dll),由 VB6“代理”(exe) 通过 COM 接口(interface)执行。 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)
并且 VB6 UnhandledExceptionFilter
将异常转换为 VB6 引发的错误。 (但这里也没有调用它,而且这段 VB6 代码多年来一直没有更改——甚至没有重新编译。)
在 VB6 代码创建的第一个 .NET 对象的构造函数中,我向 AppDomain.CurrentDomain.UnhandledException
添加了一个处理程序(并且,在尝试调试此问题时,我添加了一个用于 Windows.Forms.Application.ThreadException
,但它没有帮助,并不是说我们有任何由 .NET 显示的 UI。
我确定在 VS2008 中开发这段代码时 UnhandledException
事件已经捕获了一些东西,但我不确定我是否在 VS2015 中看到过它。
代码正在运行多个线程,其中一些正在执行主要目的,包括插入和更新 SQL Server 数据,还通过 TCP 协议(protocol)进行通信,由其他线程处理,包括 BackgroundWorker
.
那些执行主要目的的人是通过以下方式创建的:
taskThread = New Thread(AddressOf EnsureTaskCompletes)
taskThread.SetApartmentState(Threading.ApartmentState.STA)
taskThread.Start()
它太专有且复杂,无法向您展示更多代码,但我在调试此问题时调整了代码以简单地 Throw New Exception
而不是最终具有相同效果的复杂代码.(*)
这个“简单”的异常没有被 UnhandledExceptionHandler
处理,除非我打开了非托管调试,否则它会静静地终止程序。
当 .NET Framework“仅”作为 dll 加载时,AppDomain.CurrentDomain.UnhandledException
的行为是否有记录的更改?
(由于 COM 重新注册,我不想在 VS2008 中构建以前的版本以确认是行为更改。我已经确认了一个 . NET 3.5 Exe 由 VS2015 编译创建一个 Thread
抛出未处理的异常 does 处理 UnhandledException
中的异常事件。)
我的解决方法是将 Catch
添加到 EnusreTaskCompletes
中的现有 Try Finally
中,它已经尝试至少记录该线程在任务完成之前被终止,并自己调用 UnhandledExceptionHandler
。
(*实际问题是数据库中缺少一个表,该表仅在您用完信用时使用——我没有添加该代码或表。这引发了一个未被UnhandledExceptionHandler
,使得调试变得相当困难——SQL Server Profiler 终于找到了问题。)
最佳答案
这是一个难以置信的广泛主题,速度惊人。不,当从 VB6 调用代码时,您永远不会观察到 UnhandledException 事件。跨互操作边界传递异常是严格禁止的。
CLR 遵从,它使用 CCW 中的 catch-em-all 异常处理程序来捕获异常。并将其转换为符合 COM 标准的 HRESULT 错误代码。每个 .NET 异常都有一个不同的 Exception.HResult属性(property)值(value)。
VB6 运行时依次将它们转换为 VB6 错误。您需要使用 On Error
语句来捕获它们。 CLR 实现 IErrorInfo 以提供一些信息,VB6 Err.Number
属性具有 Exception.HResult 值,Err.Description
为您提供Exception.Message 属性值。但是,您将不会获得 Holy Stacktrace,如果您需要 InnerException 属性来诊断故障,将会给您带来严重的不便。考虑使用 AppDomain.FirstChanceException 事件来记录详细信息。
调试这样的异常很容易。使用项目 > 属性 > 调试 > 启动外部程序单选按钮。选择已编译的 VB6 程序或 VB6 IDE。强制调试器在第一次出现异常时停止,在 VS2015 中使用“调试”>“Windows”>“异常设置”并勾选“公共(public)语言运行时异常”。
请注意,此机制不适用于您在自己的工作线程上运行的任何代码。在互操作场景中处理这些问题非常棘手。大概这就是让您对“有时有效”的情况感到困惑的原因。
请务必小心使用 SetUnhandledExceptionFilter(),它很容易破坏 .NET 代码。 CLR 也调用该函数来安装自己的处理程序并使用它来引发一些 异常。值得注意的是 NullReferenceException 和 DivideByZeroException,C# 代码可能想要捕获的异常类型。还有一些非常糟糕的东西,比如 AccessViolationException,你永远不想捕捉到它。它还可能会干扰 VB6 错误,顺便说一下,运行时也使用 SEH 来引发异常。
关于.net - AppDomain.UnhandledException 未捕获未处理的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39900390/
我正在调查奇怪的 WPF 多线程应用程序挂起,这种挂起在生产机器上比在开发机器上更容易随机发生。 我添加了 Application.Dispatcher.UnhandledException 和 Cu
如题。 我一直在谷歌搜索并阅读 threads ... 我很确定没有其他地方可以使用 e.Handle 来阻止异常冒泡到 UnhandledException 处理程序。 我测试我的代码如下: 应用程
我有一个应用,尽管存在以下处理程序,但有时会意外终止 AppDomain.CurrentDomain.UnhandledException,Application.Current.Dispatcher
根据 Microsoft 文档,当线程(来自线程池或使用 System.Threading.Thread 类创建)发生未处理的异常时,应为应用程序的默认 AppDomain 触发 AppDomain.
我正在编写一个小库来捕获所有未处理的异常,显示一个小对话框(类似于 NF 的常用对话框),让用户有机会将异常发送给开发人员。为此,我像这样使用 AppDomain 的 UnhandledExcepti
我们有一个 .NET 3.5 程序集 (dll),由 VB6“代理”(exe) 通过 COM 接口(interface)执行。 VB6 代码调用: ' Ensure that no system di
我在全局范围内捕获异常并且它工作正常,除了应用程序在 UnhandledExceptions 上没有恢复的部分。 . 我在 MSDN 上读过,为了允许调度程序异常捕获未处理的非 UI 异常,我需要做以
我试图在我的应用程序中捕获所有未处理的异常,以便有条件地处理那些可以在不终止应用程序的情况下发生的异常,但我无法解决一个非常基本的问题:它不会停止异常。代码中某处抛出未处理的异常,它出现在这里,显示消
在我的应用程序中,每当出现任何未处理的异常时,我都想显示一个消息对话框。但是似乎在抛出未处理的异常时没有出现对话框消息,显示消息弹出窗口是否有效?同样在 MSDN 文档中,我没有找到太多相关信息。 下
我目前正在开发一个完全模块化的 .NET 应用程序,其中: 有加载模块 DDL 的主机应用程序。模块 DDL 具有可以多次打开的形式。 您可以卸载应用程序域。这将导致模块的所有打开形式被关闭。 我想做
在我的 App.xaml.cs 中,我创建了一个处理程序来响应 AppDomain.CurrentDomain.UnhandledException事件。 在处理程序中,我需要调用一个异步方法来发送有
我正在使用 AppDomain 提供的 UndhandledException,我所做的基本上是这样的: static void Main(string[] args) { AppDo
建议的重复是关于DispatcherUnhandledException,而不是AppDomain.CurrentDomain.UnhandledException。 原创: 应该在哪里订阅AppDo
我有一个非常简单的线程。 Thread 对象所做的唯一事情就是throw new Exception();。我这样做的原因是因为我需要测试如果异常发生在我的应用程序的单独线程中会发生什么。我已经用“真
在下面的代码片段中,为什么在单元测试中抛出异常时附加的处理程序(AppDomain.CurrentDomain.UnhandledException 事件)不会启动? 我在 VS2010 上使用 NU
情况 好吧,正如您在下面看到的,我有一个主应用程序,它创建了一个线程,它创建了一堆后台 worker 。当 RunWorkerCompleted 在某些 BG worker 上被触发时,我有时最终会丢
我有一个带有绑定(bind)到 Application.CurrentDomain.UnhandledException 的事件处理程序的 .NET 程序。 运行带有调试的程序时,当抛出未处理的异常时
由于未处理的 XAML 异常,有时会引发我的应用程序中的 UnhandledException 处理程序。 UnhandledExceptionEventArgs 包含消息 E_RUNTIME_SET
我正在尝试创建一个 AppDomain 并从 F# 附加到它的 UnhandledException 事件,但我运气不佳。在我的事件处理程序中,我需要对触发事件的域以及事件参数的引用。 要重现此问题,
当 AppDomain 有未处理的异常时,您可以处理 AppDomain.CurrentDomain.UnhandledException 事件。 但是,您无法阻止 AppDomain 关闭。你不能只
我是一名优秀的程序员,十分优秀!