Netty异常处理 - Handler抛出Exception,那又怎样?

时间:2012-03-24 22:11:31

标签: java exception-handling netty

我一直在寻找Netty的异常处理模式,但我找不到多少。

某种异常处理指南会很棒。我有抛出异常被发送到exceptionCaught但我不知道接下来该做什么。

有人可以提供有关如何处理Netty中的异常的通用说明。处理从ChannelHandler抛出的异常的预期模式是什么?

谢谢, 马特

3 个答案:

答案 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");
    }
}

希望这有帮助。