2012-03-24 11 views
9

Ich habe nach einem Ausnahmebehandlungsmuster für Netty gesucht, aber ich kann nicht viel finden.Netty Ausnahmebehandlung - Handler wirft Ausnahme, was dann?

Eine Art von Ausnahmebehandlungsführer wäre großartig. Ich habe Ausnahmen ausgelöst, die an exceptioncaught gesendet werden, aber ich weiß nicht, was ich als nächstes tun soll.

Kann jemand eine allgemeine Erklärung zum Umgang mit Ausnahmen in Netty bereitstellen? Was ist das erwartete Muster für die Behandlung einer Ausnahme, die von einem ChannelHandler ausgelöst wird?

Danke, Matt

Antwort

2

Es ist wirklich von der jeweiligen Implementierung abhängt und welche Art von Ausnahme. Manchmal kannst du dich vielleicht erholen, manchmal ist es am besten, den Kanal zu schließen.

Also ich denke, es ist unmöglich zu sagen, wie es zu handhaben ..

2

mit Norman Zustimmung.

In der Regel versuche ich alle Anwendungs ​​Ausnahme zu fangen und zu behandeln und richtige Nachrichten mit den Fehlern zurückgeben.

Zum Beispiel würde ich in einem HTTP-Server eine 404 zurückgeben, wenn eine Datei nicht gefunden wurde.

Ich füge auch die folgende Funktion in meinem Handler für alle Ausnahmen, die ich nicht abfangen konnte - die in der Theorie nur Netzwerkfehler sein sollte. Ich neige zu einem Schwarz-Weiß-Ansatz für diese Ausnahmen und nehme an, dass ich mich nicht erholen kann. Daher schließe ich den Kanal. Es ist Aufgabe des Kunden, es erneut zu versuchen.

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

Hoffe, das hilft.

3

Wie Norman und Veebs haben beide erwähnt, ohne die genauen Anforderungen zu verstehen, es ist ein wenig kompliziert aber eine genaue Antwort zu geben .... ich folgendes denken eine generische Art und Weise liefert Server-Fehler zu behandeln, die Sie nicht erwartet hatten. Er gibt einen HTTP 500 "Interner Serverfehler" an den Client zurück und schließt dann den Kanal. Offensichtlich gehe ich davon aus, dass Ihre Kunden HTTP anfordern und empfangen, was sie möglicherweise nicht sind. In diesem Fall ist Veebs 'Lösung besser.

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

Hinweis Wenn Sie diese Lösung verwenden, dann müssen Sie auch eine HttpResponseDecoder zu Ihrer Pipeline hinzuzufügen.

Offensichtlich, wenn Sie bestimmte Ausnahmen haben, die Sie fangen und behandeln möchten, würden Sie etwas zusätzliche Logik hier schreiben, um das zu tun.

HTH!