(版本:Netty 4.0.4.Final)

如果ChannelInboundHandler中出现异常,则可以使用exceptionCaught()方法处理它,但是如果ChannelOutboundHandler中出现异常,则不能。因为exceptionCaught()不是呼叫。为什么会这样呢?

只有通过分析Future结果的方式来处理出站异常,如下所示:

channel.writeAndFlush(serverPacket).addListener(new ChannelFutureListener() {
        @Override
        public void operationComplete(ChannelFuture future) throws Exception {
            if (!future.isSuccess()) {
                future.cause().printStackTrace();
            }
        }
});


但这是非常不便的。

最佳答案

这是设计使然...出站操作仅通过Future进行通知,否则我们将需要执行两次通知,这会降低性能。如果要将其传播到exceptionCaught处理程序,则只需将ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE作为侦听器添加到返回的ChannelFuture。

09-03 19:53