据我所知,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下载文件时发生超时 调用方可以通过“捕获”它们来处理这些异常,并且仅应在以下情况下进行: 它实际上可以解决特殊情况
然后我把它用作: 但是最后一行代码没有捕获任何异常,我的代码给出运行时异常并停止。你能解释为什么会发生这种情况,如果可能的话,如何修复它吗?