4

いくつかのアイテムを削除するためのこのコードがあります:

    private static void DeleteBatch(IList<TableEntity> toDelete)
    {
        if(toDelete == null)
            throw new ArgumentNullException("toDelete");
        if(toDelete.Count == 0)
            throw new ArgumentException("There is no elements in toDelete.");
        if(toDelete.GroupBy(e => e.PartitionKey).Count() > 1)
            throw new ArgumentException("The entities to delete must have the same PartitionKey.");

        Parallel.ForEach(Partitioner.Create(0, toDelete.Count, 100),
                         range =>
                         {
                             TableBatchOperation batchOperation = new TableBatchOperation();
                             for (Int32 i = range.Item1; i < range.Item2; i++)
                                 batchOperation.Delete(toDelete[i]);
                             _table.ExecuteBatch(batchOperation);
                         });
    }

テーブル エンティティは * ETag で渡されます。

場合によってStorageException: The specified resource does not exist.は、これが 404 HttpStatusCode であると推測されます。この場合、存在しないかどうかは気にしないので、それらを引き起こした操作についてはこの例外を無視したいと思います。バッチ内の個々の TableOperations に対して 404 を無視する方法、または少なくともこの例外をスローしなかった TableOperations に対してバッチ操作を再試行する方法 (どの操作が失敗したかを知る方法)。404 の原因を特定するためだけに、各操作を個別に行うのは非常に非効率的です。

4

2 に答える 2

9

バッチ操作では、エラーを無視することはできないと思います。StorageException をキャプチャして RequestInformation.ExtendedErrorInformation プロパティを検査することで、バッチ内のどのエンティティが失敗したかを特定するためにできることが 1 つあります。特に ErrorCode と ErrorMessage については、以下のスクリーンショットをご覧ください。ここで行ったことは、バッチの 2 番目のエンティティがエンティティの削除バッチ操作で失敗することです。ErrorCode は "ResourceNotFound" として取得されますが、興味深いのは ErrorMessage です。見ると、「1: 指定されたリソースが存在しません」というエラーメッセージが表示されます。基本的に、バッチで失敗したエンティティのインデックスを提供します。

ここに画像の説明を入力

次にできることは、バッチを 3 つの部分に分割することです。つまり、この失敗したエンティティの前のもの、この失敗したエンティティ (単一アイテム)、およびこの失敗したエンティティの後のエンティティであり、別々の操作でそれらを試します。

于 2013-01-12T06:26:26.423 に答える