当前位置: 首页 > 知识库问答 >
问题:

如何使netty处理程序在捕获到异常后继续读取数据?

太叔京
2023-03-14

在我的netty处理程序中,我覆盖了exceptionCaught方法来捕获由netty ObjectDecoder抛出的TooLongFrameException。在出现异常的情况下,我会向服务器发送一条消息,告知该错误的相关信息。服务器收到该消息,然后尝试继续发送更多数据。问题是,我的处理程序似乎没有继续读取数据。

我使用netty 4.1.18最终版

import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.handler.codec.TooLongFrameException;

public final class MyHandler extends SimpleChannelInboundHandler<MyObject> {

    @Override
    protected void channelRead0(ChannelHandlerContext channelHandlerContext, MyObject obj) throws Exception {

    }
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        if (cause instanceof TooLongFrameException) {
            ctx.writeAndFlush( messageAboutError );
            return;
        } else
            ctx.writeAndFlush( messageAboutUnexpectedError );
        super.exceptionCaught(ctx, cause);
    }
}

在我捕获到netty ObjectDecoder抛出的异常后,如何让我的处理程序继续读取数据?

共有1个答案

淳于煌
2023-03-14

真正的问题是,一旦您处于这种状态,ObjectDecoder将出现一个混乱的“解码状态”,因此除了断开连接之外,您没有什么可以做的。如果您要使用另一种消息格式,您可以做的就是丢弃消息的其余部分,只在收到新消息后再开始解析。如何做到这一点等,实际上取决于协议本身。

 类似资料:
  • 我一直在研究如何改变c#方法执行的行为,特别是当出现异常以支持: 重试/继续:能够再次尝试同一语句并在成功后继续跳过/继续:移动到下一个语句并继续执行 我读过很多回复,说这是糟糕的编码实践,但这是针对代码转换器的,它从支持此功能的语言转换数百万行代码。我需要在功能上保持一致。

  • 问题内容: 因此,我的教授为我们分配了一个项目,我们必须从文本文件中接收命令并使用它们来驱动程序的流程。这些命令-起飞,着陆,装载货物,卸载货物等-用于模拟飞机状物体。 有时执行这些命令没有意义,例如在飞机飞行中装载货物。因此,为防止发生此类情况,我们必须在自己的异常类中进行编码,即 “如果命令飞机在飞行中装载货物,则抛出InvalidActionException” 我的问题是:引发异常后,如何

  • 我有这个密码- 编译器将如何实现这一点。在生成的汇编代码中,对异常的检查实际放在哪里? 更新 我知道上面的代码是如何翻译成字节码的。字节码仅将try-catch转换为相应的try-handler块。我感兴趣的是JVM将如何将其转换为汇编/与或处理。

  • 我有以下情况,我试图看看是否有解决方案: 两个Spring服务调用必须并行进行(一个是现有的服务调用/逻辑,另一个是新添加的服务调用) 然而,一条快乐的道路应该是直截了当的,当涉及到服务发出的错误时,应该遵守以下规则: > 如果其中只有一个失败,则通过另一个服务(异步)记录错误,并且API只返回成功服务的结果--这可以通过相应的线程来完成。 我的问题是,因为这些服务返回某个对象的列表,即使我使用并

  • 问题内容: 一旦在此代码中捕获到异常,该方法就会运行,但是一旦我输入一个数字,程序就会关闭,并显示“生成成功”消息。一旦发生异常,是否有任何方法可以返回while循环? 问题答案: 将 try / catch 放入 while循环中 :

  • 问题内容: 我的示例代码如下: 我的要求是,在捕获到异常之后,我要处理数组的其余元素。我怎样才能做到这一点? 问题答案: 您的代码应如下所示: