当前位置:首页 > 服务端 > Netty全局异常捕获器

Netty全局异常捕获器

2022年11月05日 23:23:37服务端20

1.创建全局异常处理器

创建全局异常处理器

@Slf4j
public class GlobalExceptionHandler extends ChannelDuplexHandler {
     
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
     
        if(cause!=null){
     
            log.error("读数据异常: "+cause);
        }
    }

    @Override
    public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
     
        ctx.write(msg,promise.addListener(new ChannelFutureListener() {
     
            @Override
            public void operationComplete(ChannelFuture channelFuture) throws Exception {
     
                if(!channelFuture.isSuccess()){
     
                    log.error("写数据异常:"+channelFuture.cause());
                }
            }
        }));
    }
}
  • exceptionCaught是用来捕获Inbound抛出的异常
  • 重写write是用来捕获outbound抛出的异常

可以通过debug模式,发现当write方法抛出异常后,会进入到AbstractChannelHandlerContext中的invokeWrite0,如下所示:

    private void invokeWrite0(Object msg, ChannelPromise promise) {
     
        try {
     
            ((ChannelOutboundHandler)this.handler()).write(this, msg, promise);
        } catch (Throwable var4) {
     
            notifyOutboundHandlerException(var4, promise);
        }
    }

可以看见,异常是被try…catch的,而catch后会调用promise中注册方法。
想要捕获异常,就需要在一开始写的地方往promise注册监听。

2.全局异常处理器的放置位置

摆放在所有Handler之后

 public static void main(String[] args) {
     
        NioEventLoopGroup boss= new NioEventLoopGroup();
        NioEventLoopGroup work = new NioEventLoopGroup();

        ServerBootstrap serverBootstrap = new ServerBootstrap();
        serverBootstrap.group(boss,work)
                .channel(NioServerSocketChannel.class)
                .option(ChannelOption.SO_BACKLOG, 128)
                .option(ChannelOption.TCP_NODELAY,false)
                .childHandler(new ChannelInitializer<SocketChannel>() {
     
                    @Override
                    protected void initChannel(SocketChannel socketChannel) throws Exception {
     
                        ChannelPipeline pipeline = socketChannel.pipeline();
                        pipeline.addLast(new ChannelInHandler("InHandler1",false));
                        pipeline.addLast(new ChannelOutHandler("outHandler1",true));
                        //全局异常处理器
                        pipeline.addLast(new GlobalExceptionHandler());
                    }
                });

        ChannelFuture future = null;
        try {
     
            future = serverBootstrap.bind(8080).sync();
            if(future.isDone()) {
     
                log.info("服务端启动成功");
            }
            future.channel().closeFuture().sync();
        } catch (InterruptedException e) {
     
            log.info("服务端启动或者关闭时出现异常");
        } finally {
     
            boss.shutdownGracefully();
            work.shutdownGracefully();
        }

    }

作者:铁拳道道尔
来源链接:https://blog.csdn.net/m0_53246313/article/details/123032389

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/server/68049.html

标签: Netty异常
分享给朋友:

“Netty全局异常捕获器” 的相关文章

解决 There is no getter for property named ‘null‘ in class 的报错异常

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: There i...

Java异常(一) Java异常简介及其架构

Java异常(一) Java异常简介及其架构

  概要 本章对Java中的异常进行介绍。内容包括:Java异常简介Java异常框架 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3544168.html   Java异常简介   ...

after : """>【异常】Maxwell异常 Exception in thread "main" net.sf.jsqlparser.parser.TokenMgrError: Lexical error at line 1, column 596. Encountered: after : ""

1 详细异常 Exception in thread "main" net.sf.jsqlparser.parser.TokenMgrError: Lexical error at line 1, column 596. Encountered: <EOF>...

Error no matching function for call to 'std::exception::exception(const char [15])'

Error no matching function for call to 'std::exception::exception(const char [15])'

Error no matching function for call to 'std::exception::exception(const char [15])' Error 'logic_error' was not declared in this scope 错误...

Uncaught Error: SECURITY_ERR: DOM Exception 18

Question: I get the following error in Ch...

AndoridStudio--Error:FAILURE: Build failed with an exception.

相信用过Android Studio开发的朋友都知道,Andorid Studio有时候在运行的时候突然出现如下信息: Error:FAILURE: Build failed with an exception. * What went wrong: Execut...

android studio 的FAILURE: Build failed with an exception解决办法

android studio 的FAILURE: Build failed with an exception解决办法

关于导入项目、或者从远程pull下来的项目出现”FAILURE: Build failed with an exception”的解决方法: 如果项目列表显示错误可以考虑用以下方式 1、检查目录列表是否有以下文件,如没有请从其...

解决项目启动报错--maven依赖冲突

解决项目启动报错--maven依赖冲突

这个问题之前出现过一次,和同事讨论了2天,解决了。后来合 了一下master的分支,问题又出现了,但是忘记了解决方法。现在记录一下免得时间长了又忘记了。 问题描述: Caused by: org.springframework.beans.factory.Unsat...

org.springframework.beans.factory.BeanCreationException

错误:org.springframework.beans.factory.BeanCreationException: Error creating bean with name '/company/list': Injection of resource fields failed;...

error和exception有什么区别?

Error(错误)表示系统级的错误和程序不必处理的异常,是java运行环境中的内部错误或者硬件问题。比如:内存资源不足等。对于这种错误,程序基本无能为力,除了退出运行外别无选择,它是由Java虚拟机抛出的。Exception(违例)表示需要捕捉或者需要程序进行处理的异常,它处理的是因为...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。