2012-03-24 26 views
9

私はNettyの例外処理パターンについて調べていますが、それほど多くは見つかりません。Netty例外処理 - ハンドラが例外をスローした後、何を?

何らかの例外処理ガイドが素晴らしいでしょう。 exceptionCaughtに送信された例外がスローされていますが、次に何をすべきかわかりません。

Nettyで例外を処理する方法の一般的な説明があります。 ChannelHandlerからスローされた例外を処理するために期待されるパターンは何ですか?

おかげで、 マット

答えて

2

は、それは本当にあなたの実装と例外の種類に依存します。場合によっては回復できるかもしれませんが、それ以外の時間はチャンネルを閉じるだけでよい場合もあります。

だから私は

2

はノーマンに同意します..それを処理するためにどのように伝えるために、そのことは不可能だと思います。

一般に、すべてのアプリケーション例外をキャッチして処理し、エラーを含む適切なメッセージを返します。

たとえば、HTTPサーバーでは、ファイルが見つからなかった場合は404を返します。

また、私がキャッチしなかった例外については、以下の関数をハンドラに追加しました。理論的にはネットワーク型のエラーのみにする必要があります。私はこれらの例外に対して白黒のアプローチをとる傾向があり、回復できないと考えています。したがって、私はチャンネルを閉じます。もう一度試してみるのはクライアントの責任です。

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

これが役立ちます。

3

ノーマンとVeebsは両方ともあなたの正確な要件を理解することなく、正確な答えを出すのはちょっと難しいです。 次は、あなたが期待していなかったサーバーエラーを処理する一般的な方法を提供すると思います。クライアントにHTTP 500の「内部サーバーエラー」を返し、チャネルを閉じます。明らかに、私はあなたのクライアントがHTTPを要求して受信しているかもしれないという仮定をしています。その場合は、Veebsの方が優れています。

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

注このソリューションを使用する場合、HttpResponseDecoderもパイプラインに追加する必要があります。

明らかに、特定の例外をキャッチして処理したい場合は、それを行うためのロジックを追加します。

HTH!