So fangen Sie alle Ausnahmen in netty

8

Soweit ich weiß Netty handle Ausnahmen von Override-Methode Ausnahmecaught (). Aber was ich will, ist ein Handler, der alle Ausnahmen ein- oder aushandeln kann. Also sollte die Pipeline wie folgt aussehen:

InboundExceptionHandler - InboundHandler1 - InboundHandler2 - OutboundHandler1 - OutboundHandler2 - OutboundExceptionHandler

Das heißt, ich sollte in meiner Pipeline zwei Ausnahme-Handler in Kopf und Schwanz getrennt platzieren. Aber ich denke, es sieht hässlich aus. eine bessere Idee?

    
Alexis 23.06.2015, 04:54
quelle

1 Antwort

15

Sie könnten einfach einen ein- und ausgehenden Ausnahmebehandler am Anfang / Ende Ihrer Pipeline haben. Wenn Sie alle Ausnahmen abfangen möchten, können Sie etwas tun (ich nehme an, dies ist Netty 4.0):

%Vor%

Alle Ausnahmen, die von eingehenden Handlern ausgelöst werden, werden die Pipeline "nach oben" propagieren und die Methode exceptionCaught() dieses Handlers aufrufen, vorausgesetzt, ein Handler darunter verbraucht sie nicht.

Für ausgehende Operationen wie write() und connect() müssen Sie ChannelFutureListener hinzufügen, um ihre Ausnahmen abzufangen. Die Methode exceptionCaught() wird nur für Ausnahmen von eingehenden Ereignissen wie channelRead() , channelActive() usw. aufgerufen.

Mit diesem Handler an der "Spitze" der Pipeline können wir Ausnahmen von allen ausgehenden Handlern unten erfassen. Angenommen, einer Ihrer Outbound-Handler führt eine Codierung durch, und dies schlägt mit einer Ausnahme fehl. Dies wird von unserem Channel-Future-Listener übernommen, den wir der Operation write() operation hinzugefügt haben.

Wenn dieser Ausnahmebehandler am "unteren" / oberen Ende der Pipeline installiert wurde, wie Sie ursprünglich vorgeschlagen hatten, würde er keine Ausnahmen von darüber liegenden Handlern sehen, da die Methode write() niemals aufgerufen würde, wenn der Schreibvorgang fehlgeschlagen wäre ein vorheriger Handler. Deshalb muss dieser Handler oben sein.

Um Verwirrung über den oberen / unteren Rand der Pipeline zu vermeiden, würde ich Ihre Beispielpipeline wie folgt konfigurieren:

%Vor%     
Ben Evans 26.06.2015, 12:53
quelle

Tags und Links