当前位置: 首页 > 面试题库 >

如何捕捉净值中的所有异常

通博实
2023-03-14
问题内容

据我所知,netty通过重写方法exceptionCaught()处理异常。但是我想要的是一个可以处理所有异常的处理程序。因此,管道应类似于:

InboundExceptionHandler-
inboundHandler1-inboundHandler2-outboundHandler1-outboundHandler2-OutboundExceptionHandler

这意味着我应该在我的流水线中以头尾分开放置2个异常处理程序。但我认为它看起来很丑。有更好的主意吗?


问题答案:

您可以在管道的顶部/尾部只有一个入站和出站异常处理程序。如果您想捕获所有异常,则可以执行以下操作(我假设这是Netty 4.0):

import io.netty.channel.*;

import java.net.SocketAddress;

public class ExceptionHandler extends ChannelDuplexHandler {

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
        // Uncaught exceptions from inbound handlers will propagate up to this handler 
    }

    @Override
    public void connect(ChannelHandlerContext ctx, SocketAddress remoteAddress, SocketAddress localAddress, ChannelPromise promise) {
        ctx.connect(remoteAddress, localAddress, promise.addListener(new ChannelFutureListener() {
            @Override
            public void operationComplete(ChannelFuture future) {
                if (!future.isSuccess()) {
                    // Handle connect exception here...
                }
            }
        }));
    }

    @Override
    public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) {
        ctx.write(msg, promise.addListener(new ChannelFutureListener() {
            @Override
            public void operationComplete(ChannelFuture future) {
                if (!future.isSuccess()) {
                    // Handle write exception here...
                }
            }
        }));
    }

    // ... override more outbound methods to handle their exceptions as well
}

入站处理程序引发的任何异常都将“向上”传播到管道中并调用此处理程序的exceptionCaught()方法,前提是下面的处理程序不使用它们。

对于像出站操作write()connect(),你需要添加一个ChannelFutureListener吸引他们的异常。
exceptionCaught()方法只调用的例外,从入站事件一样channelRead()channelActive()等等。

通过将此处理程序置于管道的“顶部”,我们可以捕获下面所有出站处理程序的异常。假设您的出站处理程序中的一个正在执行某种编码,但此操作失败并例外,这将由我们添加到该write()操作的Promise中的通道将来的侦听器处理。

如果此异常处理程序像您最初建议的那样安装在管道的“底部”
/头部,则它将看不到来自其上方处理程序的异常,因为write()如果在先前的处理程序中写入失败,则永远不会调用其方法。这就是为什么此处理程序必须位于顶部的原因。

为了希望避免对管道顶部/底部的混淆,这是我如何配置示例管道:

pipeline.addLast(outboundHandler2)        // bottom
        .addLast(outboundHandler1)
        .addLast(inboundHandler2)
        .addLast(inboundHandler1)
        .addLast(new ExceptionHandler()); // top


 类似资料:
  • 我在用滑翔4。当URL返回404时,获取FileNotFoundException。我尝试使用RequestListener捕捉异常。但它并没有缓存这个异常。 记录如下: 2019-03-20 17:48:07.134 32233-32233/com。zyta。zflikz带滑翔:装载失败https://lh4.googleusercontent.com/-UxjwFuQRjXA/AAAAAAAA

  • 问题内容: 我正在尝试编写一个使用PyQt5在系统托盘中运行的应用程序。该代码有时会引发异常,我需要能够捕获它们。 我希望当应用程序中发生异常时,会退出主事件循环,因此像这样捕获它应该起作用: 在下面的示例中,当我按下“提高”按钮时,我仅看到回溯,但从未看到打印过的内容。 有2个类似的问题,但是那里的答案并没有满足我的需要: 抓住PyQt中的任何异常:OP希望 监视 异常,不退出偶数循环。 防止P

  • null null 有什么捕捉机制吗? 下面是我的bean配置中的一个片段: 下面是我的错误处理程序:

  • 我目前在我的路由中使用dotry/doCatch块,因此我无法使用全局onException块。 然而,如果驼峰路由中断(由于错误代码或意外/未测试的场景),我希望执行一些业务逻辑。希望这永远不会发生,但我仍然想处理更糟糕的情况。 我不能在全局OneException块中有java.lang.Exception,而且,我不想在每个路由上都添加一个额外的捕获。 在抛出未捕获的异常和中断路由之前,是否

  • 本文向大家介绍.NET Framework 捕捉异常,包括了.NET Framework 捕捉异常的使用技巧和注意事项,需要的朋友参考一下 示例 在特殊情况下,代码可以并且应该引发异常。例如: 尝试阅读流的末尾 没有访问文件的必要权限 尝试执行无效的操作,例如被零除 从Internet下载文件时发生超时 调用方可以通过“捕获”它们来处理这些异常,并且仅应在以下情况下进行: 它实际上可以解决特殊情况

  • 然后我把它用作: 但是最后一行代码没有捕获任何异常,我的代码给出运行时异常并停止。你能解释为什么会发生这种情况,如果可能的话,如何修复它吗?