Netty 如何捕获从ChannelInitializer.initChannel引发的异常?

Netty 如何捕获从ChannelInitializer.initChannel引发的异常?,netty,Netty,我有一个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:MyExcep

我有一个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:MyException [堆栈跟踪]


作为记录,我使用的是5.0.0.Alpha2,看起来netty只是记录了异常,并没有触发任何东西。见:


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

ChannelInitializer异常传播将添加到netty 4.0.29.Final中,如中所述。您可以共享
initChannel
方法的代码吗?您知道异常的来源吗?我认为您唯一的机会是从通道初始化中获取此异常。@Moh-Aw从概念上讲,只需从initChannel抛出一个通用异常即可。当然,可以用try/catch形式包装initChannel的内容。但是,netty由于没有通过netty框架传播异常而表现不佳。由于ChannelInitializer扩展了实现ChannelHandler的ChannelHandlerAdapter,人们希望通过exceptionCaught处理异常。正如我所解释的,netty在调用initChannel时处于特殊情况,即设置管道。如果此操作抛出,则可以认为通道管道设置不正确,在这种情况下,最好关闭通道。更好的做法是将管道设置为“故障安全”模式,即不可能引发异常,并可能添加一个初始处理程序,该处理程序执行可以引发的逻辑(如果在工作流中可能)…然后是:
if(!success){ctx.close();}
立即关闭频道。另请参阅javadoc:
@throws异常,如果发生错误,将引发异常。在这种情况下,{@link Channel}将被关闭。
是的,但op希望捕获该异常。