2012-03-24 26 views
9

Ho cercato un modello di gestione delle eccezioni per Netty ma non riesco a trovare molto.Mancata gestione delle eccezioni: il gestore lancia Eccezione, e allora?

Una sorta di guida alla gestione delle eccezioni sarebbe ottima. Ho eccezioni lanciate che vengono inviate a exceptionCaught ma non so cosa fare dopo.

Qualcuno può fornire una spiegazione generica su come gestire le eccezioni in Netty. Qual è il modello previsto per la gestione di un'eccezione generata da un ChannelHandler?

Grazie, Matt

risposta

2

in realtà dipende l'implementazione e che tipo di eccezione. A volte potresti essere in grado di recuperare, altre volte potrebbe essere il modo migliore per chiudere il Canale.

Quindi penso la sua impossibilità di dirvi come gestire la cosa ..

2

d'accordo con Norman.

In generale, provo a catturare e gestire tutte le eccezioni dell'applicazione e restituire i messaggi corretti contenenti gli errori.

Ad esempio, in un server HTTP, restituirei un 404 se non è stato trovato un file.

Aggiungo anche la seguente funzione nel gestore per eventuali eccezioni che non ho rilevato, che in teoria dovrebbero essere solo errori di tipo di rete. Tendo ad adottare un approccio in bianco e nero a queste eccezioni e presumo che non posso recuperare. Quindi, chiudo il canale. Spetterà al cliente riprovare.

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

Spero che questo aiuti.

3

Come Norman e Veebs hanno entrambi menzionato, senza capire le vostre precise esigenze, è un po 'complicato dare una risposta precisa comunque ... Penso che quanto segue fornisce un modo generico per gestire errori del server che non ci si aspettava. Restituisce un HTTP Server 'Internal Server Error' al client e quindi chiude il canale. Ovviamente, sto supponendo che i tuoi clienti stiano richiedendo e ricevendo via HTTP e che potrebbero non esserlo, nel qual caso la soluzione di Veebs è migliore.

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

Nota Se si utilizza questa soluzione allora si avrà bisogno di aggiungere un HttpResponseDecoder per la pipeline anche.

Ovviamente se si dispone di eccezioni specifiche che si desidera catturare e gestire, scrivere qui una logica aggiuntiva per farlo.

HTH!