2012-03-24 29 views
9

He estado buscando un patrón de manejo de excepciones para Netty, pero no puedo encontrar mucho.Manejo de excepciones de Netty - Handler throws Excepción, ¿entonces qué?

Algún tipo de guía de manejo de excepciones sería genial. Tengo excepciones lanzadas que se envían a exceptionCaught, pero no sé qué hacer a continuación.

¿Puede alguien proporcionar una explicación de propósito general de cómo manejar excepciones en Netty. ¿Cuál es el patrón esperado para manejar una excepción lanzada desde un ChannelHandler?

Gracias, Matt

Respuesta

2

Realmente depende de su aplicación y qué tipo de excepción. A veces puede recuperarse, otras veces puede ser lo mejor cerrar el Canal.

Por lo tanto, creo que es imposible saber cómo manejarlo ..

2

De acuerdo con Norman.

En general, intento capturar y manejar todas las excepciones de la aplicación y devolver los mensajes adecuados que contienen los errores.

Por ejemplo, en un servidor HTTP, devolvería un 404 si no se encontraba un archivo.

También agrego la siguiente función en mi controlador para cualquier excepción que no haya detectado, que en teoría solo deberían ser errores de tipo de red. Tiendo a tomar un enfoque en blanco y negro a estas excepciones y supongo que no puedo recuperarme. Por lo tanto, cierro el canal. Corresponderá al cliente intentarlo nuevamente.

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

Espero que esto ayude.

3

Como han mencionado Norman y Veebs, sin entender sus requisitos precisos es un poco difícil dar una respuesta precisa, sin embargo ... Creo que lo siguiente proporciona una forma genérica de manejar los errores del servidor que no esperaba. Devuelve un HTTP 500 'Internal Server Error' al cliente y luego cierra el canal. Obviamente, estoy asumiendo que sus clientes están solicitando y recibiendo a través de HTTP lo que pueden no ser, en cuyo caso la solución de Veebs es mejor.

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 si utiliza esta solución, entonces tendrá que añadir un HttpResponseDecoder a su tubería también.

Obviamente, si tiene excepciones específicas que desea capturar y manejar, entonces debe escribir algo de lógica adicional aquí para hacerlo.

HTH!