我一直在寻找Netty的异常处理模式,但我找不到多少。
某种异常处理指南会很棒。我有抛出异常被发送到exceptionCaught但我不知道接下来该做什么。
有人可以提供有关如何处理Netty中的异常的通用说明。处理从ChannelHandler抛出的异常的预期模式是什么?
谢谢, 马特
答案 0 :(得分:3)
正如Norman和Veebs都提到的那样,在不了解你的确切要求的情况下,给出一个精确的答案却有点棘手.... 我认为以下提供了一种处理您不期望的服务器错误的通用方法。它返回HTTP 500'内部服务器错误'到客户端然后关闭频道。显然,我假设您的客户正在通过HTTP请求和接收他们可能不是的,在这种情况下,Veebs的解决方案更好。
import org.jboss.netty.channel.ChannelFutureListener;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.ExceptionEvent;
import org.jboss.netty.channel.SimpleChannelHandler;
import org.jboss.netty.handler.codec.http.DefaultHttpResponse;
import org.jboss.netty.handler.codec.http.HttpResponse;
import org.jboss.netty.handler.codec.http.HttpResponseStatus;
import org.jboss.netty.handler.codec.http.HttpVersion;
public class ServerErrorHandler extends SimpleChannelHandler {
@Override
public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e)
throws Exception {
HttpResponse err = new DefaultHttpResponse(HttpVersion.HTTP_1_1,
HttpResponseStatus.INTERNAL_SERVER_ERROR);
e.getChannel().write(err).addListener(ChannelFutureListener.CLOSE);
}
}
请注意,如果您使用此解决方案,则还需要在管道中添加HttpResponseDecoder。
显然,如果你有特殊的例外情况,你想要抓住并处理,那么你可以在这里写一些额外的逻辑来做到这一点。
HTH!
答案 1 :(得分:2)
这实际上取决于您的实现以及什么类型的Exception。有时候你可能会恢复,有时候关闭频道可能是最好的。
所以我觉得不可能告诉你如何处理它..
答案 2 :(得分:2)
同意诺曼。
通常,我尝试捕获并处理所有应用程序异常并返回包含错误的正确消息。
例如,在HTTP服务器中,如果找不到文件,我将返回404。
我还在我的处理程序中添加了以下函数,用于我没有捕获的任何异常 - 理论上应该只是网络类型错误。我倾向于对这些异常采取黑白方法,并假设我无法恢复。因此,我关闭了频道。客户可以再试一次。
@Override
public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception {
try {
_logger.error(e.getCause(), "ERROR: Unhandled exception: " + e.getCause().getMessage()
+ ". Closing channel " + ctx.getChannel().getId());
e.getChannel().close();
} catch (Exception ex) {
_logger.debug(ex, "ERROR trying to close socket because we got an unhandled exception");
}
}
希望这有帮助。