如何捕获子线程异常

一 直接在主线程捕获子线程异常(此方法不可取)

using System;
using System.Threading;
namespace CatchThreadException
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Thread t = new Thread(() =>
                {
                    throw new Exception("我是子线程中抛出的异常!");
                });
                t.Start();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
}

代码执行结果显示存在“未经处理的异常”。所以使用此方法并不能捕获子线程抛出的异常。

二 在子线程中捕获并处理异常

using System;
using System.Threading;
namespace CatchThreadException
{
    class Program
    {
        static void Main(string[] args)
        {
            Thread t = new Thread(() =>
            {
                try
                {
                    throw new Exception("我是子线程中抛出的异常!");
                }
                catch (Exception ex)
                {
                    Console.WriteLine("子线程:" +
ex.Message);
                }
            });
            t.Start();
        }
    }
}

使用此方法可以成功捕获并处理子线程异常,程序不会崩溃。

三 子线程中捕获异常,在主线程中处理异常

using System;
using System.Threading;
namespace CatchThreadException
{
    class Program
    {
        private delegate void ThreadExceptionEventHandler(Exception ex);
        private static ThreadExceptionEventHandler exceptionHappened;
        private static Exception exceptions;
        static void Main(string[] args)
        {
            exceptionHappened = new ThreadExceptionEventHandler(ShowThreadException);
            Thread t = new Thread(() =>
                {
                    try
                    {
                        throw new Exception("我是子线程中抛出的异常!");
                    }
                    catch (Exception ex)
                    {
                        OnThreadExceptionHappened(ex);
                    }
                }
            );
            t.Start();
            t.Join();
            if (exceptions != null)
            {
                Console.WriteLine(exceptions.Message);
            }
        }
        private static void ShowThreadException(Exception ex)
        {
            exceptions = ex;
        }
        private static void OnThreadExceptionHappened(Exception ex)
        {
            if (exceptionHappened != null)
            {
                exceptionHappened(ex);
            }
        }
    }
}

使用此方法同样可以成功捕获并处理子线程异常,程序同样不会崩溃。

此方法的好处是当主线程开启了多个子线程时,可以获取所有子线程的异常后再一起处理。

时间: 2024-12-28 18:20:45

如何捕获子线程异常的相关文章

JAVA并发,线程异常捕获

由于线程的特性,当我们启动了线程是没有办法用try catch捕获异常的,如下例: 1 package com.xt.thinks21_2; 2 3 import java.util.concurrent.ExecutorService; 4 import java.util.concurrent.Executors; 5 6 /** 7 * 线程异常捕获测试 8 * 9 * @author xue 10 * 11 */ 12 public class ThreadUncaughtExcepti

Android 子线程更新UI 异常

众所周知,Android是不可以在子线程中直接更新UI的,需要借助Handler或者View.post(Runnable runnable)或者runOnUIThread(Runnable runnable)将更新的代码切入到主线程中去实现UI更新. 我们来试一下,在Activity的 onCreate中直接在新线程中去更新一个TextView的文本,结果发现,WHAT?竟然没有抛出异常,更新也成功了? 这是因为在onCreate中尚未完成View的绘制,此时TextView中有个变量mLayo

Java子线程中的异常处理(通用)

在普通的单线程程序中,捕获异常只需要通过try ... catch ... finally ...代码块就可以了.那么,在并发情况下,比如在父线程中启动了子线程,如何在父线程中捕获来自子线程的异常,从而进行相应的处理呢? 常见错误 也许有人会觉得,很简单嘛,直接在父线程启动子线程的地方try ... catch一把就可以了,其实这是不对的. 原因分析 让我们回忆一下Runnable接口的run方法的完整签名,因为没有标识throws语句,所以方法是不会抛出checked异常的.至于Runtime

3、Java多线程-处理子线程异常

处理子线程异常(重要).参考:https://www.cnblogs.com/jpfss/p/10272066.html1.Java子线程中的异常处理 父线程中启动子线程,直接在父线程启动子线程的地方try...catch,是捕获不到子线程的异常的 原因:Runnable接口的run方法的完整签名,因为没有标识throws语句,所以方法是不会抛出checked异常的.至于RuntimeException这样的 unchecked异常,由于新线程由JVM进行调度执行,如果发生了异常,也不会通知到父

关于Handler的理解,子线程不能更新UI的纠正和回调的思考

开发Android这么久了,总会听到有人说:主线程不能访问网络,子线程不能更新UI.Android的主线程的确不能长时间阻塞,但是子线程为什么不能更新UI呢?今天把这些东西整理,顺便在子线程更新UI. 首先写了一个handler在子线程更新主线程UI,在子线程做了一个耗时操作:从网络下载了一个图片并利用handler发送到handleMessage()的回调中,并更新到主线程的bitmap.图片显示成功,没有问题.接下来在子线程中更新onCreate()中实例化的textview,报错: and

Android -- ViewRoot,关于子线程刷新UI

Android在4.0之后执行线程更新UI操作会报异常:CalledFromWrongThreadException:Only the original thread that created a view hierarchy can touch its views.那么你肯定能看到很多文章说android里子线程不能刷新UI.这句话不能说错,只是有些不太严谨.其实线程能否刷新UI的关键在于ViewRoot是否属于该线程. 首先,CalledFromWrongThreadException这个异

Android子线程更新UI主线程方法之Handler

背景: 我们开发应用程序的时候,处于线程安全的原因子线程通常是不能直接更新主线程(UI线程)中的UI元素的,那么在Android开发中有几种方法解决这个问题,其中方法之一就是利用Handler处理的. 下面说下有关Handler相关的知识. 多线程一些基础知识回顾:在介绍Handler类相关知识之前,我们先看看在Java中是如何创建多线程的方法有两种:通过继承Thread类,重写Run方法来实现通过继承接口Runnable实现多线程 具体两者的区别与实现,看看这篇文章中的介绍:http://de

Android子线程访问网络

之所以Google在Android4.0之后,禁止主线程访问网络,是为了更好的用户体验.也就是主线程是为了界面的显示.如果主线程访问网络,就会造成"卡顿".也就是对于网络状况的不可预见性,很有可能在网络访问的时候造成阻塞,那么这样一来我们的主线程UI线程就会出现假死的现象,产生很不好的用户体验.所以,默认的情况下如果直接在主线程中访问就报出了这个异常,名字是NetworkOnMainThreadException.主线程操作5s的相应时间,就会关闭该线程,所以将耗时很大的操作放在子线程

JAVA Thread线程异常监控

一.场景描述:单线程程序可以用try...catch捕获程序的异常,而在多线程程序的时候是无法使用try...catch捕获. 示例1:多线程发生异常,无法使用try...catch捕获问题 public class NoCaughtThread implements Runnable{ @Override public void run() { System.out.println(3 / 2); System.out.println(3 / 0); System.out.println(3