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 属性来完成。看看下面的截图,尤其是 ErrorCode 和 ErrorMessage。我在这里所做的是使我的批处理中的第二个实体在删除实体批处理操作中失败。您将得到 ErrorCode 作为“ResourceNotFound”,但有趣的是 ErrorMessage。如果您看到,您会收到 ErrorMessage 为“1:指定的资源不存在”。它基本上为您提供了批处理中失败的实体的索引。

在此处输入图像描述

然后您可以做的是将批次分成 3 个部分 - 在此失败实体之前的部分,此失败实体(单个项目),然后是此失败实体之后的实体,并在单独的操作中尝试它们。

于 2013-01-12T06:26:26.423 回答
2

您要问的是批处理操作的失败操作索引。

我已经为 StorageExtension 实现了一个扩展类,它提供了提取有用信息的方法,包括失败的操作索引。

看看:https ://www.nuget.org/packages/AzureStorageExceptionParser/

它提供了提取的扩展方法 - ErrorCode - ETag - ExtendedErrorMessage - FailedOperationIndex(失败的批处理操作) - HttpStatusCode - OperationStartTime (UTC) - OperationEndTime (UTC) - RequestDate (UTC) - RequestId - TargetLocation(主要、次要等) - IsOptimisticConcurrencyFailure

于 2016-01-28T18:23:29.317 回答