利用UncaughtExceptionHandler全局处理线程异常

处理线程未捕获的异常UncaughtExceptionHandler 为什么需要UncaughtExceptionHandler? 1.主线程可以轻松发现异常,子线程却不行(比如子线程抛出了RuntimeException异常,而主线程start子线程后后续还有很多逻辑,子线程的异常可能夹杂在日志里无法轻松发现)。 2.子线程异常无法用传统方法捕获(比如在主方法里try/catch不能捕获到子线程里面的异常,他只能捕获主线程的异常)。 处理多线程子线程的异常有两种方式: 第一种是手动在每个run方法里进行try/catch,不推荐这种方式,写起来繁琐。 第二种是利用Uncau 阅读详情

线程的未捕获异常UncaughtException应该如何处理?

为什么需要UncaughtExceptionHandler?

  • 主线程可以轻松发现异常,子线程却不行;
  • 子线程异常,无法用传统方法进行捕获;

代码演示:

/** 单线程,抛出,处理,有异常堆栈
    多线程,子线程发送异常,会有什么不同
 * */
public class ExceptionInChildThread implements Runnable{

    @Override
    public void run() {
        throw  new RuntimeException();
    }

    public static void main(String[] args) {
        new Thread(new ExceptionInChildThread()).start();
        for(int i = 0; i < 1000; i++){
            System.out.println(i);
        }
    }
}

输出:

 

1.不加try catch 抛出4个异常,都带线程名字;

2.加了try catch,期望捕获到第一个线程的异常,线程234不应该运行,希望看到打印出Caught Exception;

3.执行时发现,根本没有Caught Exception,线程234依然运行,并且抛出异常 说明线程的异常不能用传统方法捕获。

代码演示:

public class CantCatchDirectly implements Runnable{

    @Override
    public void run() {
        throw new RuntimeException();
    }

    public static void main(String[] args) throws InterruptedException {
        try{
            new Thread(new CantCatchDirectly(),"MyThread-1").start();
            Thread.sleep(300);
            new Thread(new CantCatchDirectly(),"MyThread-2").start();
            Thread.sleep(300);
            new Thread(new CantCatchDirectly(),"MyThread-3").start();
            Thread.sleep(300);
            new Thread(new CantCatchDirectly(),"MyThread-4").start();
        }catch (RuntimeException e){
            System.out.println("Caught Exception.");
        }
    }
}

输出结果;

此处try catch是针对主线程的,没有办法捕捉的子线程的异常,所以这里传统方法失效。

 

推荐解决方法:利用UncaughtExceptionHandler

  • UncaughtExceptionHandler接口
  • void uncaughtException(Thread t, Throwable e);

这里给程序设置统一的异常捕获:

分别新建两个类,UseOwnUncaughtExceptionHandler.java ,MyUncaughtExceptionHandler.java。

代码如下:

import java.util.logging.Level;
import java.util.logging.Logger;

/** 自行设置的 MyUncaughtExceptionHandler */
public class MyUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler{

    private String name;

    public MyUncaughtExceptionHandler(String name) {
        this.name = name;
    }

    /** 传入参数:
      Thread t:产生异常的线程;
     Throwable e:具体的异常信息
     * */
    @Override
    public void uncaughtException(Thread t, Throwable e) {
       Logger logger = Logger.getAnonymousLogger();
       logger.log(Level.WARNING," 线程异常,已终止 "+t.getName(),e);
        System.out.println(name + "捕获了异常" + t.getName() + "异常" + e);
    }
}
/** 使用刚才自己写的UncaughtExceptionHandler */
public class UseOwnUncaughtExceptionHandler implements Runnable{

    @Override
    public void run() {
        throw new RuntimeException();
    }

    public static void main(String[] args) throws InterruptedException {
        Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandler("异常捕获器1"));
            new Thread(new UseOwnUncaughtExceptionHandler(),"MyThread-1").start();
            Thread.sleep(300);
            new Thread(new UseOwnUncaughtExceptionHandler(),"MyThread-2").start();
            Thread.sleep(300);
            new Thread(new UseOwnUncaughtExceptionHandler(),"MyThread-3").start();
            Thread.sleep(300);
            new Thread(new UseOwnUncaughtExceptionHandler(),"MyThread-4").start();
    }
}

运行UseOwnUncaughtExceptionHandler.java:

 

run()方法本身方法声明的时候,没有声明抛出异常,所以在方法层面,我们只能自己去做try catch处理。

 

Java 捕获并处理线程异常:Thread线程异常捕获、ThreadPoolExecutor线程池异常捕获 Thread.UncaughtExceptionHandler捕获线程异常 ThreadPoolExecutor#afterExecute方法捕获线程池异常 以及两者实现的原理 阅读详情

相关推荐

ADS谐波平衡仿真自动优化报错?三步搞定HB控件设置(附常见错误排查)

本文针对ADS谐波平衡仿真在自动优化中常见的报错问题,提供了三步核心排查法。首先检查并禁用HB控件中可能导致冲突的小信号仿真模式,其次合理化仿真频率与扫描参数设置,最后审视优化变量与目标的定义。通过精准配置HB控件以适配自动优化流程,能有效解决大多数仿真失败问题,确保非线性电路设计顺利进行。

c2d3e4f的博客 788

如何处理UncaughtException异常

如何处理UncaughtException异常为什么要处理UncaughtException异常怎么处理UncaughtException异常线程很容易被发现,子线程中的异常不易被发现。子线程抛出的异常无法使用传统方法捕获。直接捕获异常可以提高代码的健壮性。使用UncaughtExceptionHandler处理未捕获的异常 为什么要处理UncaughtException异常 在一个项目中,会有很多UncaughtException异常。如果这些异常没有处理,就有可能把异常信息返回给前端,黑客看到这些异常的

papinick的博客 1万+

后向投影算法(BPA)-SAR成像算法系列(二)

SAR成像算法:后向投影算法(BPA)原理介绍及实现步骤解析。

yjh_2019的博客 1万+

Java线程异常UncaughtExceptionHandler

捕获线程的执行异常 在线程的run方法中,如果有受检异常必须进行捕获处理,如果想要 获 得 run() 方 法 中 出 现 的 运 行 时 异 常 信 息 , 可 以 通 过 回 调 UncaughtExceptionHandler 接口获得哪个线程出现了运行时异常.在 Thread 类中有关处理运行异常的方法有: getDefaultUncaughtExceptionHandler() 获 得 全 局 的 ( 默 认 的)UncaughtExceptionHandler getUncaughtExcept

weixin_43939924的博客 1255

数据安全实战技能解析:从加密攻防到数字水印的竞赛指南

数据安全是信息安全领域的核心,其基础在于密码学与信息隐藏技术。密码学通过加密算法(如AES、RSA)和哈希函数,保障数据的机密性与完整性,其原理涉及对称/非对称加密、工作模式及密钥管理。数字水印技术则基于信号处理(如DCT/DWT变换),将信息嵌入多媒体载体,用于版权保护与溯源。这些技术的价值在于为数据全生命周期提供“防泄漏”与“可追溯”的解决方案,广泛应用于企业数据治理、合规审计和**数据防泄漏(DLP)** 系统。本文以一场贴近实战的**数据安全职业技能竞赛**为切入点,深入剖析如何运用密码分析、磁盘取

weixin_34314962的博客 402

基于深度学习的水果新鲜程度检测系统(UI界面 + YOLOv8/v7/v6/v5代码 + 训练数据集)

本文详细介绍了如何使用YOLO系列模型(YOLOv5、YOLOv6、YOLOv7、YOLOv8)构建水果新鲜度检测系统。通过数据集准备、模型训练、推理过程以及UI界面的实现,我们能够构建一个实时检测水果新鲜度的系统。通过本博客,您可以全面了解如何应用深度学习技术解决实际问题,尤其是在智能监控和食品质量检测领域。

YOLO 815

Crash: 处理UncaughtExcption,捕获未处理异常信息,界面友好提示用户

Crash: 处理UncaughtExcption,友好提示用户,捕获错误信息相信大家在APP使用过程都遇到过,应用程序异常崩溃,屏幕一黑闪退,这种情况称之为Crash。出现的原因是由于程序运行过程中产生了未知异常UncaughtException,当程序发生Crash时,系统会杀死程序,出现闪退,这种情况的用户体验不好,而且开发人员也不能知道用户发生了何种异常。 那么问题来了,发生Crash时我

萧萧北keno的专栏 2325

UI自动化控制PC端微信获取当前群聊的群友列表

在一个月前,某个群友在获取整个群的群友信息时遇到了一点问题: 对整个群进行群友数据获取经测试确实有点棘手,下面我将我的解决过程公布给大家。 基础教程详见: https://blog.csdn.net/as604049322/article/details/121391639 人工打开要抓取的群聊窗口后,首先获取微信窗口并点击聊天信息按钮: import uiautomation as auto auto.uiautomation.SetGlobalSearchTimeout(1) wechatWind

小小明-代码实体的专栏 3万+

线程的未捕获异常UncaughtException应该如何处理?

可以使用UncaughtExceptionHandler,有以下的原因: 首先应该注意:try/catch只能捕获对应线程内的异常,不同的线程组合在一个用try/catch进行包起来不能进行捕获 主线程可以轻松发现异常,而子线程不行 子线程的异常不会影响到主线程的执行,即使子线程有异常抛出,并且打印了异常信息,主线程依然能够正常运行 子线程异常无法用传统方法进行捕获 ...

weibozhouchao的博客 2986

基于Matlab的自动泊车系统开发:利用模糊控制实现智能停车解决方案的详细教程

Matlab是一种广泛应用于科学计算、工程建模与仿真的编程语言,其强大的工具箱和简洁的编程语法,使其成为开发自动泊车系统的理想选择。在开始编写代码之前,我们需要搭建Matlab的工作环境,并熟悉相关的工具箱,如Fuzzy Logic Toolbox,用于实现模糊控制。首先,确保你已经安装了Matlab软件,并加载了必要的工具箱。接下来,我们将逐步讲解如何在Matlab中实现自动泊车系统。

qq_38334677的博客 663

某AI推荐系统项目管理复盘:架构师总结的6大方法论与调优策略

我是张三,某大厂资深AI架构师,主导过5个千万级用户的推荐系统项目(覆盖电商、内容、视频、音乐、外卖等场景)。我的公众号“AI架构师笔记”会分享更多AI项目管理和技术实战经验,欢迎关注。最后的话:推荐系统不是“一锤子买卖”,而是“持续优化的过程”。希望这篇文章能帮你少踩坑,多做对——毕竟,把复杂的事做成,才是架构师的核心能力。

2501_92132293的博客 362

第九章、核心7:线程异常处理(全局异常处理UncaughtExceptionHandler)

线程的未捕获异常UncaughtException应该如何处理? 1、为什么需要UncaughtExceptionHandler? 主线程可以轻松发现异常,子线程却不行 子线程异常无法用传统方法(try-catch)捕获(类似main方法中执行thread.start,抛出异常是在子线程的run中,而try-catch的是主线程main,所以捕获不到) 不能直接捕获会导致一些后果(无法捕获到异常,做相应的重试操作逻辑) 2、两种解决方案 方案一(不推荐):手动在每个run方法里进行try catch

Coder 678

12、控件使用之录入英文、阿拉伯数字删除增加功能及二维码显示

控件使用之录入英文、阿拉伯数字删除增加功能及二维码显示1、用到的控件2、添加控件2.1、添加【文本录入】控件2.1、添加【文本显示】控件2.1、添加【QR 二维码】控件3、保存工程及生成文件4、下载文件 1、用到的控件   需要用的显示控件为【文本显示】控件和【QR二维码】控件,以及触控控件【文本录入】控件。 2、添加控件 2.1、添加【文本录入】控件   【文本录入】控件也叫【ASCI 文本录入】,是用来录入ASCI 字符,打开 DGUS 软件,点击【触控控件】—【文本录入】,用鼠标框选一个区域,即可在右

嵌入式羊圈 625

Java多线程--全局异常处理--方法/实例

原文网址: 简介 说明 本文用示例介绍如何处理Java多线程中的异常。 在Java中,线程中的异常是不能抛出到调用该线程的外部方法中捕获的。 为什么不能抛出异常到外部线程捕获? 因为线程是独立执行的代码片断,线程的问题应该由线程自己来解决,而不要委托到外部。基于这样的设计理念,在Java中,线程方法的异常都应该在线程代码边界之内(run方法内)进行try catch并处理掉。换句话说,我们不能捕获从线程中逃逸的异常。 JDK如何控制线程异常不会跑...

IT利刃出鞘的博客 1723

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

多线程的未捕获异常类 UncaughtExceptionHandler 的使用

*** 自定义 UncaughtExceptionHandler*/@Overridelogger.log(Level.WARNING,"线程异常:"+t.getName(),e);System.out.println(name+"我捕获了异常"+t.getName()+"异常名字:"+e);

Qynwang的博客 2180

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

线程未捕获异常处理器Thread.UncaughtExceptionHandler

public class Test1 { /** * 线程未捕获异常处理器接口 Thread.UncaughtExceptionHandler * 此接口会在线程由于未捕获异常而突然终止时被调用 */ public static class CustomUncaughtExceptionHandler implements Thread.Uncaug...

CodingSoldier的博客 901

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

多线程核心7:处理未捕获的异常

使用UncaughtExceptionHandler的原因 主线程可以轻松发现异常,子线程不能 子线程的异常无法用传统方式捕获 在捕获到异常时也能进行处理,提高健壮性 全局异常处理使用方式 实现Thread.UncaughtExceptionHandler接口 public class MyUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler { private String name; public

那股哇的博客 213

全局异常处理UncaughtExceptionHandler

android 程序错误处理全局处理 java线程unchecked 异常的处理UncaughtExceptionHandler

DevXP的专栏 700

Java并发编程之线程异常

多线程异常第一种处理方式:局部处理 在多线程编程中,如果主线程出现异常,我们可以使用try/catch等方式轻松的处理异常; 如果子线程出现异常,则需要在每个子线程中可能发生异常的地方用try/catch进行处理,代码如下: public class CommonThread implements Runnable { @Override public void run() {...

qq_36986015的博客 221

Java线程学习记录(九)——线程异常处理

线程的未捕获异常UncaughtException应该如何处理 为什么需要UncaughExceptionHandler 主线程可以轻松发现异常,子线程却不行 public class ExceptionInChildThread implements Runnable { public static void main(String[] args) { new Thread(new ExceptionInChildThread()).start(); for (i

Csea的博客 542

Java 线程异常处理

子线程中发生了异常,,而不会记录任何日志。所以,如果什么都不做的话,是会出现子线程任务既没执行成功,也没有任何日志提示的“诡异”现象的。

m0_74295055的博客 603

线程异常

此文章为微信公众号“我们都是小青蛙”学习笔记。 多个线程中的任务是并发执行的,一个线程中抛出的异常是不能被别的线程catch并处理的,比如main线程中的异常最多被抛到main方法中,其他线程中的异常最多能被抛到run方法,再往上抛就是传说中的虚拟机了。所以如果我们没有处理某个线程中抛出的异常,那这个线程只能死掉。 而Thread类给我们提供了一个所谓的异常处理器的接口 public class Thread implements Runnable { // ... 为节省篇幅,省略其他字段和方法

qq_30864125的博客 294

Android自定义Thread.UncaughtExceptionHandler异常线程捕获

1.Thread.UncaughtExceptionHandler类 背景: 未捕获异常大多发生在在多线程环境中,子线程抛出的异常是不能用主线程中 try….catch 捕获。可以给线程设置 UncaughtExceptionHandler ,当出现异常时会回调 UncaughtExceptionHandler 中的uncaughtException(Thread t, Throwable e) 方法 设置可以为某个线程单独设 thread.setUncaughtExceptionHandler(new M

脉冲星飞行记录 707

UncaughtExceptionHandler实例

UncaughtExceptionHandler实例

weixin_45428910的博客 385

【多线程】线程异常知多少?

1.常见问题 1.1 Java异常体系图 1.2 实际工作中,如何全局处理异常?为什么要全局处理?不处理行不行? 1.3 run方法是否可以抛出异常?如果抛出异常,线程的状态会怎么样? run()方法不可以向上抛出异常,只可以自己捕获,抛出异常后,线程停止运行,进入终止状态。 2. 线程的未捕获异常UncaughtException应该如何处理? 2.1 为什么需要UncaughtExceptionHandler? 主线程可以轻松发现异常,子线程却不行 /** * 描述:单线程,抛出处理,有异常堆

Dreamlate_Spider的博客 991

5.线程异常

程序执行结果如下所示,当Thread1抛出异常时,应当进入catch分支,并终止程序运行。但实际上没有,程序继续运行,4个子线程分别抛出异常,这说明使用try catch没有捕获到子线程异常。2.UncaughtExceptionHandler源码分析。程序执行结果如下所示,4个子线程抛出的异常都被捕获。1.不能用传统方法捕获线程异常。

Steven的博客 248
上一篇: Java内存模型原理小结
下一篇: Tomcat小记
专业逮虾户
博客等级 码龄7年 1粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值