gpt4 book ai didi

netty - 在 Netty 4 中,如何捕获所有处理程序的未处理异常捕获?

转载 作者:行者123 更新时间:2023-12-04 23:22:07 43 4
gpt4 key购买 nike

在我的 channel 管道中,有很多处理程序。

据我了解,如果我不覆盖他们的 exceptionCaught(ChannelHandlerContext ctx, Throwable cause)方法,默​​认行为是 cause将被抛出到管道中,并且管道将在 WARN 级别记录这样的事情:

An exception was thrown by a user handler's exceptionCaught() method while handling the following exception: ...

我想覆盖上面的管道行为以添加一些特定的逻辑(例如:如果 causejava.io.IOException: Connection reset by peer ,请不要记录任何内容以避免在 WARN 级别出现太多“不太有用”的日志)。

我该怎么办?

经过一番调查,我找到了这个源代码:
https://github.com/netty/netty/blob/4.0/transport/src/main/java/io/netty/channel/DefaultChannelHandlerContext.java
private void invokeExceptionCaught(final Throwable cause) {
try {
handler.exceptionCaught(this, cause);
} catch (Throwable t) {
if (logger.isWarnEnabled()) {
logger.warn(
"An exception was thrown by a user handler's " +
"exceptionCaught() method while handling the following exception:", cause);
}
}
}

因为它是 private ,我不认为我可以在不使用反射的情况下轻松覆盖它。有没有更好的办法?

最佳答案

你可以通过定义一个 ExceptionHandler 来做到这一点。然后将此处理程序放在管道的尾部。

ChannelPipeline p = ch.pipeline();
p.addLast("business", new SomeBusinessHandler());
p.addLast...
p.addLast("exception", new ExceptionHandler());//Make sure this is the last line when init the pipeline.

并在 exceptionCaught 中编码您的特定逻辑方法。但永远不要重新抛出异常,因为这是管道的结尾。

关于netty - 在 Netty 4 中,如何捕获所有处理程序的未处理异常捕获?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21152367/

43 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com