首页
学习
活动
专区
工具
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.4K40

    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 中的全局异常处理

    61510

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

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

    3K10

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

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

    42020

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

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

    32810

    dotnet 警惕 async void 线程顶层异常

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

    21840

    关于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,会导致界面不断改变而混乱不堪。

    81450

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

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

    66630

    Flutter | 异常处理

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

    83510

    面试官:线程池遇到未处理的异常会崩溃吗?

    ,遇到了未处理的异常会怎么呢?...1 的情况下,到遇到未处理的异常时,执行任务的线程却不一样,这说明了:当使用 execute 方法时,如果遇到未处理的异常,会抛出未捕获的异常,并将当前线程进行销毁。...小结线程池在遇到未处理的异常时,不同添加任务的方法的执行行为是不同的:execute 方法:遇到未处理的异常,线程会崩溃,并打印异常信息。...submit 方法:遇到未处理的异常,线程本身不会受到影响(线程可以复用),只是将异常信息封装到返回的对象 Future 中。...课后思考为什么遇到未处理的异常时,execute 方法中的线程会崩溃,而 submit 方法中的线程却可以复用?

    20410
    领券