私はNettyの例外処理パターンについて調べていますが、それほど多くは見つかりません。Netty例外処理 - ハンドラが例外をスローした後、何を?
何らかの例外処理ガイドが素晴らしいでしょう。 exceptionCaughtに送信された例外がスローされていますが、次に何をすべきかわかりません。
Nettyで例外を処理する方法の一般的な説明があります。 ChannelHandlerからスローされた例外を処理するために期待されるパターンは何ですか?
おかげで、 マット
私はNettyの例外処理パターンについて調べていますが、それほど多くは見つかりません。Netty例外処理 - ハンドラが例外をスローした後、何を?
何らかの例外処理ガイドが素晴らしいでしょう。 exceptionCaughtに送信された例外がスローされていますが、次に何をすべきかわかりません。
Nettyで例外を処理する方法の一般的な説明があります。 ChannelHandlerからスローされた例外を処理するために期待されるパターンは何ですか?
おかげで、 マット
は、それは本当にあなたの実装と例外の種類に依存します。場合によっては回復できるかもしれませんが、それ以外の時間はチャンネルを閉じるだけでよい場合もあります。
だから私は
はノーマンに同意します..それを処理するためにどのように伝えるために、そのことは不可能だと思います。
一般に、すべてのアプリケーション例外をキャッチして処理し、エラーを含む適切なメッセージを返します。
たとえば、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");
}
}
これが役立ちます。
ノーマンと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!