2018年1月21日日曜日

gRPC の例外処理(2)

gPRC のサービスのメソッドの引数には ServerCallContext があります。この ServerCallContext のステータスに OK 以外の値を設定すると、明示的に例外をスローしなくても RpcException がスローされます。



次のコードでは戻り値を返してメソッドを終了していますが、コンテキストのステータスに OK 以外の値を設定しているため RpcException が発生します。
public async override Task Search(Request request, ServerCallContext context)
{
    context.Status = new Status(StatusCode.Internal, "実行できません。");
    context.ResponseTrailers.Add("status", "123");

    return await Task.FromResult(Response).ConfigureAwait(false);
}

明示的に RpcException をスローしたときとほぼ同じ結果になります。
public async override Task Search(Request request, ServerCallContext context)
{
    Metadata trailers = new Metadata();
    trailers.Add("ErrorCode", "123");

    throw new RpcException(
        new Status(StatusCode.Internal, "実行できません。")
        , trailers
    );
}
二つの実装が混在するのは望ましくはありませんし、使い分ける理由もなさそうですので、開発チームで例外を返すときの実装ルールを決めたほうがよいと思います。

0 件のコメント:

コメントを投稿

paiza のスキルチェックをやってみました

いまさら感はありますが、 paiza のスキルチェックをやってみました。指定された時間内にコードを書いてユニットテストにかけ、その結果を基に評価を数値化してくれるというものですが、ゲーム感覚で空き時間を見つけて進めていこうと考えています。 どうやら時間が短いほど高い評価を得...