- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个非常简单的线程。 Thread 对象所做的唯一事情就是throw new Exception();
。我这样做的原因是因为我需要测试如果异常发生在我的应用程序的单独线程中会发生什么。我已经用“真实的”运行时异常对此进行了测试,我的问题是一样的。
在调用线程之前我做的是:
AppDomain.CurrentDomain.UnhandledException += CurrentDomainOnUnhandledException;
Application.Current.DispatcherUnhandledException += CurrentOnDispatcherUnhandledException;
//To handle exceptions in another thread
private void CurrentDomainOnUnhandledException(object sender, UnhandledExceptionEventArgs unhandledExceptionEventArgs)
{
//Do nothing ignore exception
}
//To handle all exceptions in main thread
private static void CurrentOnDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs dispatcherUnhandledExceptionEventArgs)
{
dispatcherUnhandledExceptionEventArgs.Handled = true;
}
当此线程抛出异常时,它首先像它应该的那样命中 CurrentDomainOnUnhandledException
,然后它没有命中 CurrentOnDispatcherUnhandledException
。在 CurrentDomainOnUnhandledException
之后,堆栈然后移回抛出异常的线程并再次抛出它,执行同一行。它永远不会停止这样做。这基本上是一个永无止境的循环,我不明白为什么。
UnhandledExceptionEventArgs 没有要设置的属性,也就是说我们已经处理了异常,我很确定这是问题的一部分。
我做错了什么,我如何在这个线程中捕获这个UnhandledException,让线程继续执行(首选)或者中止/杀死线程(不首选)使其不继续执行throw new异常(exception)行。
我已经用调试和发布测试了这个(确保发布时的调试信息设置为无),这在两个版本中仍然发生,异常继续一遍又一遍地发生。
在此先感谢,我只是被难住了,不知道为什么会这样。
最佳答案
When this thread does throw a exception it first hits CurrentDomainOnUnhandledException like it should, and then it does not hit CurrentOnDispatcherUnhandledException. Right after CurrentDomainOnUnhandledException The stack then moves back to the Thread where it throws the exception and throws it again, executing the same line. It never stops doing this. It is basically a never ending loop and I can not figure out why.
您从未处理过异常。您刚刚返回到最初出错的代码。假设代码是这样做的:
i = 1 / 0;
foo(i);
假设您捕捉到被零除的错误,但是在处理程序中,除了返回之外什么都不做。那么,你希望发生什么?代码遇到了一个 fatal error ,使进一步的进展变得不可能,而你没有采取任何措施来修复它。 i
应该包含什么值?!
基本上,不要 try catch 异常,除非是作为抛出异常的代码设计的一部分。它只是没有意义,无论您的外部问题是什么,都可能有一个明智的方法来做到这一点。
但是如果一个线程严重失败,它的进程也会严重失败。这就是线程的本质——没有隔离。考虑:
如果在第 2 步中途抛出异常会怎样?如果您的异常处理程序不释放锁,下一个尝试获取它的线程将永远等待。如果您的异常处理程序确实释放了锁,那么下一个获取它的线程将访问一个被部分修改并且可能处于不一致状态的对象。因此,异常处理程序必须做出明智的决定,了解引发异常的代码,以及在释放引发异常时持有的任何锁之前要做什么。
如果您要捕获异常,您必须找出潜在的问题并修复它。一般来说,只有完全理解抛出异常的代码才能这样做。没有通用的方法来执行此操作,因为没有通用的方法来修复可能损坏的对象。
Ok, then how do I kill the thread in CurrentDomainOnUnhandledException so it stops looping the exception?
通常这不是您想要做的。如果该线程持有锁怎么办?如果该线程分配了需要释放的内存怎么办?
如果您需要这种隔离,请使用进程,而不是线程。
关于来自另一个线程的 C# UnhandledException 不断循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12225011/
我正在调查奇怪的 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 关闭。你不能只
我是一名优秀的程序员,十分优秀!