首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么AppDomain.CurrentDomain.UnhandledException不能捕获来自非UI线程的未处理异常?

AppDomain.CurrentDomain.UnhandledException是一个事件,用于捕获当前应用程序域中未处理的异常。然而,它无法捕获来自非UI线程的未处理异常的原因如下:

  1. UI线程和非UI线程的异常处理机制不同:在UI线程中,未处理的异常会导致应用程序崩溃,而在非UI线程中,未处理的异常默认情况下会导致应用程序终止。这是因为UI线程通常是用户界面的主线程,而非UI线程则用于执行后台任务。为了保证应用程序的稳定性,非UI线程的异常默认情况下会导致应用程序终止。
  2. AppDomain.CurrentDomain.UnhandledException只能捕获当前应用程序域中的异常,而非UI线程通常是在单独的应用程序域中执行的。因此,即使在非UI线程中发生了未处理的异常,也无法通过AppDomain.CurrentDomain.UnhandledException来捕获。

要捕获来自非UI线程的未处理异常,可以使用其他机制,例如使用Task类的ContinueWith方法来处理任务中的异常,或者使用try-catch语句在非UI线程的代码块中捕获异常并进行处理。另外,还可以使用AppDomain.UnhandledException事件来捕获整个应用程序域中的未处理异常,包括非UI线程中的异常。

总结起来,AppDomain.CurrentDomain.UnhandledException不能捕获来自非UI线程的未处理异常是因为UI线程和非UI线程的异常处理机制不同,并且AppDomain.CurrentDomain.UnhandledException只能捕获当前应用程序域中的异常。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Unity手游崩溃异常如何捕获--C#及JVM捕获

1 C#脚本异常捕获 C#脚本未捕获异常,与Android和Native未捕获异常很大区别是,未捕获异常不会照成引用闪退。所以,C#脚本异常危害相对较小,但是同样更加容易存在在游戏中。...1.1 AppDomain.CurrentDomain.UnhandledException回调 这几乎是所有语言都会提供一个机制,在发生未捕获异常时回调。...如果是在默认域中注册,任何线程中抛出捕获异常均会触发这个未处理异常函数。 ? 然后,在游戏里面,尝试在其他线程抛出异常。 ? 但是,抛出异常后并没有被这个处理函数接收到。 ?...在UI线程中,Unity官方提供函数基本上都会有try..catch,所以很难有出现未捕获异常。比如,我们尝试通过下面的代码抛出未捕获异常 ? ?...但是,在OnLogCallbackHandler,是不能够调用Debug.Log,Debug.LogError这个API,调用都会无效。

4.2K40

win10 uwp 捕获后台线程异常

本文告诉大家如何在 UWP 中捕获全局后台线程异常,在出现后台线程异常时,将会让 UWP 程序闪退,但是在退出之前还是可以执行自己代码 在 UWP 中,如果需要捕获前台线程,也就是 UI 线程异常...,可以参见 UWP 中全局异常处理 方法 在 App 构造函数添加 UnhandledException 事件,在事件方法里面通过参数 UnhandledExceptionEventArgs 可以设置当前这个异常是否被处理...e) { e.Handled = true;// 设置为 true 那么表示这个异常被处理,应用不会闪退 } 如果是后台线程异常,需要使用 AppDomain.CurrentDomain.UnhandledException...,执行到这里应用就会闪退 } 触发后台线程异常很简单,请看下面代码 var thread = new Thread(() => throw new Exception...通过这个方法可以在软件退出前做日志记录 Application.UnhandledException Event (Windows.UI.Xaml) UWP 中全局异常处理

57610

配置 legacyUnhandledExceptionPolicy 防止后台线程抛出异常让程序崩溃退出

如果你程序抛了异常,你是怎么处理呢?等待程序崩溃退出?还是进行补救? 如果是做 UI 开发,很容易就找到 Dispatcher.UnhandledException 事件,然后在事件中进行补救。...能够写出异常处理代码开发者,微软会默认他们懂了异常处理。 写出了监听 Dispatcher.UnhandledException 事件开发者,微软会认为他们已经学会了如何在 UI 线程中处理异常。...因为微软认为,应用程序域中所有的线程发生异常都会进入这个事件中,大多数开发者都不明白这些线程这些异常是怎么回事,所以不认为这些开发者具备正确处理这些异常能力。...在这个事件中,有一个属性 IsTerminating 指示是否应用程序正因为这次异常准备退出,不过开发者并不能拿这个属性做些什么。...既然你通过这个配置节点于微软达成了契约,你就需要好好地在 Appdomain.CurrentDomain.UnhandledException 事件中写好异常恢复逻辑。

2.9K10

配置 legacyUnhandledExceptionPolicy 防止后台线程抛出异常让程序崩溃退出

如果你程序抛了异常,你是怎么处理呢?等待程序崩溃退出?还是进行补救? 如果是做 UI 开发,很容易就找到 Dispatcher.UnhandledException 事件,然后在事件中进行补救。...能够写出异常处理代码开发者,微软会默认他们懂了异常处理。 写出了监听 Dispatcher.UnhandledException 事件开发者,微软会认为他们已经学会了如何在 UI 线程中处理异常。...因为微软认为,应用程序域中所有的线程发生异常都会进入这个事件中,大多数开发者都不明白这些线程这些异常是怎么回事,所以不认为这些开发者具备正确处理这些异常能力。...在这个事件中,有一个属性 IsTerminating 指示是否应用程序正因为这次异常准备退出,不过开发者并不能拿这个属性做些什么。...既然你通过这个配置节点于微软达成了契约,你就需要好好地在 AppDomain.CurrentDomain.UnhandledException 事件中写好异常恢复逻辑。

28320

ASP.NET Core应用程序池崩溃问题分析

反编译调试 由于dump分析报告没有给出根本原因,也不熟悉如何深入分析dump,因此换个思路,通过测试找到了问题必现某个请求操作后,尝试进行反编译调试,看能不能找到引发异常根本原因。...其实这个异常在反编译调试时候就发现了,抛出后clr捕获异常,请求继续往下走,请求走完后又在clr代码中抛出了异常,然后程序池挂掉。...现在锁定了就是这段代码导致,需要进一步查看代码分析为什么会导致应用程序池崩溃。 通过反编译调试获取导致异常条件后,在本地进行模拟复现。...来自async void方法异常无法使用catch捕获,因为不是同一个线程引发异常。 通过调试可以发现,第一次异常抛出时是在当前线程,Task内部捕获了该异常,因此请求继续执行。...async void引发异常catch捕获不到,可以在AppDomain.CurrentDomain.UnhandledException中获取到异常打印异常信息。

15410

dotnet 警惕 async void 线程顶层异常

在应用程序设计里面,不单是 dotnet 应用程序,绝大部分都会遵循让应用在出现未处理异常状态时终结原则。...如果在 async void 里面发生任何未捕获异常,严重的话将会导致进程闪退 如以下代码,在当前执行线程没有线程同步上下文情况下,抛出异常将会让进程闪退 async void Foo() {...throw new Exception("林德熙是逗比"); } 为什么这里和线程同步上下文相关?原因是在有线程同步上下文时,执行都委托调度器执行,比如经典线程同步上下文 WPF 主 UI 线程。...这个时候主 UI 线程在 async void 里面抛出异常是到达 Dispatcher 里,而不是线程顶层。...其中解决方法就是要么在这些代码逻辑里面捕获所有异常规避问题,要么尝试将 async void 改造为 async Task 规避问题 这里还必须着重说明是,捕获线程顶层异常时,最好采用捕获所有异常方式

17640

关于Java异常Exception最常见十大问题1 受检异常 VS 受检异常2 异常管理最佳实践3 为什么在try语句中定义变量不能在catch和finally语句中使用?4 为什么Doubl

1 受检异常 VS 受检异常 简单说,受检异常必须在方法中被显示捕捉,或者在方法throws语句中被抛出。...受检异常是由哪些在程序编译时不能被解决问题所引起,常见有除以0,空指针等等。 受检异常非常重要,因为你希望其他使用你程序API开发者知道如何去处理这些异常。...例如,IOException是一个使用很多受检异常,RuntimeException则是一个最常见受检异常。 ?...Paste_Image.png 2 异常管理最佳实践 如果一个异常能够被正确处理,那么他就该捕获,反之,则该被抛出 3 为什么在try语句中定义变量不能在catch和finally语句中使用?...这就是为什么try语句中定义变量不能在catch和finally语句中使用。

1.1K41

android 线程那点事

为了保持较高响应速度,这就要求主线程不能执行耗时任务,这个时候子线程就派上用场了。子线程也叫工作线程,除了主线程以外线程都是子线程。...为什么会出现ANR Android希望UI线程能根据用户要求做出快速响应,如果UI线程花太多时间处理后台工作,当UI事件发生时,让用户等待时间超过5秒而未处理,Android系统就会给用户显示ANR...通过debug,我们可以捕获当前应用程序中线程(如下图),其中蓝色选中部分即为当前应用程序线程,当前程序中还运行了三个Binder,每个Binder对象都对应一个线程,这些Binder线程主要负责接收...而普通自定义Thread是一个裸线程,因此,不能直接在Thread中定义Hander对象,从使用场景角度讲,即不能直接给Thread对象发消息,但却可以给UI线程发消息。...子线程为什么不能更新UI 因为UI访问是没有加锁,在多个线程中访问UI是不安全,如果有多个子线程都去更新UI,会导致界面不断改变而混乱不堪。

75850

Flutter | 异常处理

本文示例代码 在了解 Flutter 异常捕获之前需要先了解一下 Dart 异常处理以及 Dart 线程模型,只有知道了代码执行流程,我们才能只要该在什么地方去捕获异常 Dart 中异常...Dart 可以抛出和捕获异常,如果没有被捕获,则会抛出,最终导致程序终止运行 和 Java 不同,Dart 中所有异常检查异常,方法不会声明它们抛出异常,也不要求捕获任何异常 Dart 提供了...如果 try 住异常,会先执行对应 catch,最后执行 finally Dart 单线程模型 如果程序中发送异常且没有被捕获,那么程序将会被终止,但是这在 Dart 中则不会,根本原因是因为和他运行机制有关系...例如 java 是多线程模型编程语言,任意一个线程触发异常异常没有被捕获时,就会导致整个进程退出,但是 Dart 不会,因为 Dart 是单线程模型,运行机制很相似,但是还是有一些区别,下面根据一张图来大致看一下...沙箱可以捕获,拦截或修改一些代码行为,如 Zone 中可以捕获日志输出,Timer 创建,微任务调用行为,同时 Zone 也可以捕获所有未处理异常,下面看一下 runZoned() 方法定义:

77410

Android异步通信:你了解Handler内存泄露吗?

:本该被回收对象不能被回收而停留在堆内存中 内存泄露出现原因:当一个对象已经不再被使用时,本该被回收但却因为有另外一个正在使用对象持有它引用从而导致它不能被回收。...最终内存泄露发生在Handler类外部类:MainActivity类 那么,该Handler在无设置为静态类时,为什么会造成内存泄露呢?...原因讲解 2.1 储备知识 主线程Looper对象生命周期 = 该应用程序生命周期 在Java中,静态内部类 & 匿名内部类都默认持有 外部类引用 2.2 泄露原因描述 从上述示例代码可知:...上述Handler实例消息队列有2个分别来自线程1、2消息(分别延迟1s、6s) 在Handler消息队列 还有未处理消息 / 正在处理消息时,消息队列中Message持有Handler实例引用...由于Handler = 静态内部类 / 匿名内部类(2种使用方式),故又默认持有外部类引用(即MainActivity实例),引用关系如下图: 上述引用关系会一直保持,直到Handler消息队列中所有消息被处理完毕

55730

c#异步编程-Task(二)

(()=> Go()); } 异步中同步上线文 发布异常 富客户端应用通常依赖于几种异常处理时间来处理UI线程上未捕获异常。...; } 当点击按钮,event handler运行时,在await后,执行会正常返回到消息循环1秒钟之后抛出异常无法被消息循环中catch块捕获。...为了缓解该问题,AsyncVoidMethodBuilder会捕获未处理异常(在返回void异步方法里),并把它们发布到同步上下文(如果出现的话),以确保全局异常处理时间能够触发。...如果ButtonClick返回类型是Task,那么未处理异常将导致结果Task出错,然后Task无处可去(导致未观察到异常出现) 一个有趣细微差别:无论你在await前面还是后面抛出异常,都没有区别...编译器异步函数生成Task在遇到未处理OperationCanceledException异常时会自动进入取消状态(IsCanceled返回true,IsFaulted返回false) 使用Task.Run

2.5K30

我们如何应对Python桌面应用程序崩溃

大多数出现在Python中崩溃(即未处理异常)很容易处理,但很多异常来自“底层“:Python代码、解释器代码本身中,或在Python扩展中。...我们能够“捕获”各种UNIX系统信号,当遇到致命信号(即SIGFPE)时,我们信号处理程序将尝试以下操作: 捕获每个线程Python堆栈轨迹(使用faulthandler模块) 捕获线程本机堆栈轨迹...这种格式是开源,并且有优秀服务器端工具(主要来自Google和Mozilla)来处理这些数据。...Crashpad利用结构化异常处理(或SEH)可以捕获到更全面的致命Windows特定异常。...我们不能只是#include 并调用相同函数faulthandler:因为Crashpad处理程序在一个单独进程中运行,它不能直接访问这个状态。

1.4K10
领券