【问题标题】:How do I catch an exception thrown from ChannelInitializer.initChannel?如何捕获从 ChannelInitializer.initChannel 引发的异常?
【发布时间】:2015-05-12 17:55:28
【问题描述】:

我有一个 ChannelInitializer,其中 initChannel 可以引发异常。我如何捕捉到这个异常?我尝试添加 exceptionCaught,但得到了相同的结果,大致如下:

10:24:02.547 [nioEventLoopGroup-1-0] 警告 io.netty.channel.ChannelInitializer - 无法初始化通道。结束:[id: 0x4639a9bd, /127.0.0.1:36004 => /127.0.0.1:6060] java.lang.Exception:我的异常 [堆栈跟踪]

为了记录,我使用的是 5.0.0.Alpha2

【问题讨论】:

  • 你能分享你的initChannel方法的代码吗?你知道异常来自哪里吗?我认为你唯一的机会就是让这个异常脱离频道初始化。
  • @Moh-Aw 从概念上讲,只需从 initChannel 抛出一个通用异常。当然,可以将 initChannel 的内容包装在 try/catch 形式中。但是,netty 的行为很糟糕,因为它没有通过 netty 框架传播异常。由于 ChannelInitializer 扩展了实现 ChannelHandler 的 ChannelHandlerAdapter,因此人们期望通过 exceptionCaught 来处理异常。
  • 据我理解,netty在调用initChannel时处于一种特殊情况,即建立管道。如果此操作抛出,则可以认为通道管道设置不正确,在这种情况下,最好关闭通道。最好将管道设置为“故障安全”模式,即不可能抛出异常,并可能添加一个初始处理程序来执行可以抛出的逻辑(如果这在您的工作流程中是可能的)。跨度>

标签: netty


【解决方案1】:

ChannelInitializer 异常传播将被添加到 netty 4.0.29.Final 中,如issue #3780 中所述

【讨论】:

    【解决方案2】:

    似乎 netty 只是记录了异常并没有触发任何东西。见:https://github.com/netty/netty/blob/5725e804bcfbd0c76e0f11e7911a76970eb06c8c/transport/src/main/java/io/netty/channel/ChannelInitializer.java#L74

    您应该在 initChannel 方法中进行自己的异常处理。

    【讨论】:

    • ...后跟:if (!success) { ctx.close(); } 立即关闭频道。
    • 另见 javadoc:@throws Exception is thrown if an error occurs. In that case the {@link Channel} will be closed.
    • 是的,但 op 想要捕获该异常。
    猜你喜欢
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 1970-01-01
    • 2017-03-11
    • 2019-09-13
    • 1970-01-01
    • 1970-01-01
    • 2012-03-14
    相关资源
    最近更新 更多