54 线程最外层异常的处理

Posted 蓝风9

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了54 线程最外层异常的处理相关的知识,希望对你有一定的参考价值。

前言

之前在 kafka 消费者客户端的一个 case 中曾经看到了这样的了一个情况

我没有配置 "group.id", 然后 kafka 客户端抛出了 InvalidGroupIdException

然后 输出的日志信息 除了类型, 其他 什么都没有, 主要是 么有堆栈信息 

这里 来大致看一下 这个问题, 以及 衍生出一些 其他的知识点, 诸如 dispatchUncaughtException 是怎么调用的, 我们平常 看到的错误信息 是怎么输出的?

Exception in thread "main" org.apache.kafka.common.KafkaException: xx
	at com.hx.test13.Test10ExceptionPrintStackTrace.main(Test10ExceptionPrintStackTrace.java:20)

测试用例

package com.hx.test13;

import org.apache.kafka.common.errors.InvalidGroupIdException;

/**
 * Test10ExceptionPrintStackTrace
 *
 * @author Jerry.X.He <970655147@qq.com>
 * @version 1.0
 * @date 2022-06-12 10:16
 */
public class Test10ExceptionPrintStackTrace 

    // Test10ExceptionPrintStackTrace
    public static void main(String[] args) 

//        Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandler());

//        throw new RuntimeException("xx");
//        throw new KafkaException("xx");
//        throw new ApiException("xx");
        throw new InvalidGroupIdException("xx");

    

    private static class MyUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler 
        @Override
        public void uncaughtException(Thread t, Throwable e) 
            System.err.println("MyUncaughtExceptionHandler - uncaughtException");
            e.printStackTrace();
        
    


输出现象如下 

Exception in thread "main" org.apache.kafka.common.errors.InvalidGroupIdException: xx

为什么没有堆栈信息? 

填充堆栈信息的方法被重写, 并且 什么都没有做, 因此 dispatchUncaughtException 的时候输出没有堆栈信息, 只有我们通常看到的 "Exception in thread "main" org.apache.kafka.common.errors.InvalidGroupIdException: xx"

dispatchUncaughtException 输出错误信息的默认处理?

默认的 uncaughtCaughtExceptionHandler 是当前线程的 threadGroup 

如下是 threadGroup 处理 未捕获异常 的处理方式, 也就是输出 "Exception in thread "main" org.apache.kafka.common.errors.InvalidGroupIdException: xx" 的相关处理 

vm 触发 dispatchUncaughtException 的地方

线程结束的时候, 发现有未处理的异常, 调用 dispatchUncaughtException 进行处理 

输出 uncaught_exception 的相关信息  

org.apache.kafka.common.errors.InvalidGroupIdException 
0x00000007bf7f65b0 - klass: 'org/apache/kafka/common/errors/InvalidGroupIdException'
 - ---- fields (total size 5 words):
 - private transient 'backtrace' 'Ljava/lang/Object;' @12  NULL (0 f7efecbb)
 - private 'detailMessage' 'Ljava/lang/String;' @16  "xx"0x00000007bf7f65d8 (f7efecbb f7efecb6)
 - private 'cause' 'Ljava/lang/Throwable;' @20  a 'org/apache/kafka/common/errors/InvalidGroupIdException'0x00000007bf7f65b0 (f7efecb6 f7f255d6)
 - private 'stackTrace' '[Ljava/lang/StackTraceElement;' @24  a 'java/lang/StackTraceElement'[0] 0x00000007bf92aeb0 (f7f255d6 f7f252ed)
 - private strict 'suppressedExceptions' 'Ljava/util/List;' @28  a 'java/util/Collections$EmptyList'0x00000007bf929768 (f7f252ed 0)
 - private transient 'depth' 'I' @32  0
Exception in thread "main" org.apache.kafka.common.errors.InvalidGroupIdException: xx

以上是关于54 线程最外层异常的处理的主要内容,如果未能解决你的问题,请参考以下文章

WPF捕获全局未处理异常

统一异常处理

Java 线程池 之 被“吃掉”的线程异常(附源码分析和解决方法)

spring 嵌套事务问题

spring boot快速入门 8: 异常处理

python 异常处理