• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
思想人生从关注生活开始
博客园    首页    新随笔    联系   管理    订阅  订阅

Netty 中的例外-Java快速入门教程

简而言之,Netty 是一个用于构建高性能异步和事件驱动网络应用程序的框架。I/O 操作在其生命周期内使用回调方法进行处理。

有关该框架以及如何开始使用它的更多详细信息,请参阅我们上一篇文章。

2. 处理 Netty 中的异常

如前所述,Netty 是一个事件驱动的系统,具有针对特定事件的回调方法。例外情况也是此类事件。

处理从客户端接收的数据时或在 I/O 操作期间可能会发生异常。发生这种情况时,将触发专用的异常捕获事件。

2.1. 处理源站异常

异常捕获事件在触发时由 ChannelInboundHandler 或其适配器和子类的 exceptionsCaught() 方法处理。

请注意,该回调已在通道处理程序接口中弃用。它现在仅限于 ChannelInboudHandler 接口。

该方法接受可抛出对象和 ChannelHandlerContext 对象作为参数。Throwable 对象可用于打印堆栈跟踪或获取本地化的错误消息。

因此,让我们创建一个通道处理程序 ChannelHandlerA 并使用我们的实现覆盖其 exceptionCaught():

public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) 
  throws Exception {
 
    logger.info(cause.getLocalizedMessage());
    //do more exception handling
    ctx.close();
}

在上面的代码片段中,我们记录了异常消息,并调用了 ChannelHandlerContext 的 close()。

 

这将关闭服务器和客户端之间的通道。实质上导致客户端断开连接并终止。

2.2. 传播异常

在上一节中,我们在其源通道中处理了异常。但是,我们实际上可以将异常传播到管道中的另一个通道处理程序。

我们将使用 ChannelHandlerContext 对象手动触发另一个异常捕获事件,而不是记录错误消息并调用 ctx.close()。

这将导致调用管道中下一个通道处理程序的 exceptionCaught()。

让我们修改 ChannelHandlerA 中的代码片段,通过调用 ctx.fireExceptionCaught() 来传播事件:

 
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) 
  throws Exception {
 
    logger.info("Exception Occurred in ChannelHandler A");
    ctx.fireExceptionCaught(cause);
}

此外,让我们创建另一个通道处理程序 ChannelHandlerB 并用这个实现覆盖它的 exceptionCaught():

@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) 
  throws Exception {
 
    logger.info("Exception Handled in ChannelHandler B");
    logger.info(cause.getLocalizedMessage());
    //do more exception handling
    ctx.close();
}

在服务器类中,通道按以下顺序添加到管道中:

ch.pipeline().addLast(new ChannelHandlerA(), new ChannelHandlerB());

在所有异常都由一个指定的通道处理程序处理的情况下,手动传播异常捕获的事件非常有用。

posted @ 2021-08-25 19:04  JackYang  阅读(184)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3