2012-03-24 1 views
9

Я искал шаблон обработки исключений для Netty, но я не могу найти много.Обработка исключений Netty - Броски обработчиков Исключение, то что?

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

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

Спасибо, Matt

ответ

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

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

3

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