前言
之前在 kafka 消费者客户端的一个 case 中曾经看到了这样的了一个情况
我没有配置 "group.id", 然后 kafka 客户端抛出了 InvalidGroupIdException
然后 输出的日志信息 除了类型, 其他 什么都没有, 主要是 么有堆栈信息
这里 来大致看一下 这个问题, 以及 衍生出一些 其他的知识点, 诸如 dispatchUncaughtException 是怎么调用的, 我们平常 看到的错误信息 是怎么输出的?
Exception in thread "main" org.apache.kafka.common.KafkaException: xxat 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 {// Test10ExceptionPrintStackTracepublic 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 {@Overridepublic 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
完