2012-03-24 19 views
9

Szukałem dla systemu Netty wyjątku w obsłudze wyjątków, ale nie jestem w stanie znaleźć wiele.Obsługa wyjątków Netty - Handler zgłasza wyjątek, a następnie co?

Niektóre instrukcje obsługi wyjątków byłyby świetne. Wystąpiły wyjątki wysłane do wyjątkuCaught, ale nie wiem, co dalej.

Czy ktoś może przedstawić ogólne objaśnienie, w jaki sposób obsługiwać wyjątki w Netty. Jaki jest oczekiwany wzorzec obsługi wyjątku generowanego przez ChannelHandler?

Dzięki Matt

Odpowiedz

2

To naprawdę zależy od implementacji i jakiego rodzaju wyjątku. Czasami możesz odzyskać równowagę, innym razem najlepiej zamknąć kanał.

Więc myślę, że niemożliwe, aby powiedzieć, jak sobie z tym poradzić ..

2

Zgadzam się z Norman.

Ogólnie, staram się przechwytywać i obsługiwać wszystkie wyjątki aplikacji i zwracać właściwe komunikaty zawierające błędy.

Na przykład na serwerze HTTP zwrócę 404, jeśli plik nie zostanie znaleziony.

również dodać następującą funkcję w moim obsługi żadnych wyjątków nie dosłyszałem - co teoretycznie powinno być tylko błędy typu sieci. Mam tendencję do brania czarno-białego podejścia do tych wyjątków i zakładam, że nie mogę dojść do siebie. Dlatego zamykam kanał. To klient będzie musiał spróbować ponownie.

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

Mam nadzieję, że to pomoże.

3

Tak jak wspomnieli Norman i Veebs, bez zrozumienia dokładnych wymagań, trochę trudniej jest udzielić precyzyjnej odpowiedzi ... Myślę, że poniższe informacje zapewniają ogólny sposób radzenia sobie z błędami serwera, których się nie spodziewałeś. Zwraca klientowi błąd HTTP 500 "Wewnętrzny serwer", a następnie zamyka kanał. Oczywiście zakładam, że twoi klienci żądają i odbierają za pośrednictwem HTTP, które mogą nie być, w takim przypadku rozwiązanie Veebs jest lepsze.

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

Uwaga: jeśli użyjesz tego rozwiązania, będziesz musiał dodać HttpResponseDecoder do swojego potoku.

Oczywiście, jeśli masz określone wyjątki, które chcesz przechwycić i obsłużyć, wpisz tutaj dodatkową logikę.

HTH!