Netty обработка исключений - обработчик выдает Exception, и что тогда? - PullRequest
9 голосов
/ 25 марта 2012

Я искал схему обработки исключений для Netty, но я не могу найти много.

Было бы замечательно какое-то руководство по обработке исключений.У меня есть исключения, которые отправляются в exceptionCaught, но я не знаю, что делать дальше.

Может ли кто-нибудь дать общее объяснение того, как обрабатывать исключения в Netty.Каков ожидаемый шаблон для обработки исключения, выданного ChannelHandler?

Спасибо, Мэтт

Ответы [ 3 ]

3 голосов
/ 30 ноября 2012

Как уже упоминали Норман и Вибс, без понимания ваших точных требований, однако, немного сложно дать точный ответ ... Я думаю, что следующее предоставляет общий способ обработки ошибок сервера, которые вы не ожидали. Он возвращает 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 в ваш конвейер.

Очевидно, что если у вас есть конкретные исключения, которые вы хотите отлавливать и обрабатывать, то вы должны написать здесь дополнительную логику, чтобы сделать это.

НТН!

2 голосов
/ 26 марта 2012

Согласен с Норманом.

В общем, я пытаюсь перехватить и обработать все исключения приложения и вернуть правильные сообщения, содержащие ошибки.

Например, на 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");
    }
}

Надеюсь, это поможет.

2 голосов
/ 26 марта 2012

Это действительно зависит от вашей реализации и типа исключения. Иногда вы можете восстановить, а иногда лучше просто закрыть канал.

Так что я думаю, что невозможно сказать вам, как справиться с этим ..

...