WindowsAzure.Storage v2 StorageException

时间:2013-01-16 16:53:25

标签: .net azure azure-storage

我正在从WindowsAzure.StorageClient 1.7迁移到WindowsAzure.Storage 2.0,我现在正在处理异常的管理。在guide和其他来源之后,我发现我必须从

迁移
try
{
    // Something
}
catch (StorageClientException e)
{
    switch (e.ErrorCode)
    {
        case StorageErrorCode.ContainerNotFound:
        case StorageErrorCode.ResourceNotFound:
        case StorageErrorCode.BlobNotFound:
        case StorageErrorCode.ConditionFailed:
            // Do something
    }
}

try
{
    // Something
}
catch (StorageException e)
{
    switch (e.RequestInformation.ExtendedErrorInformation.ErrorCode)
    {
        case StorageErrorCodeStrings.ContainerNotFound:
        case StorageErrorCodeStrings.ResourceNotFound:
        case BlobErrorCodeStrings.BlobNotFound:
        case StorageErrorCodeStrings.ConditionNotMet:
            // Do something
    }
}

看起来很简单。 问题是ExtendedErrorInformation总是等于null。而HttpStatusMessage则表示“指定的blob不存在。”,应该如此。

我认为它是由测试环境的模拟器引起的,但是在真实的Azure环境中尝试它会让我陷入同样的​​境地。

有什么想法吗?

3 个答案:

答案 0 :(得分:8)

另一种选择是查看RequestInformation.HttpStatusCode。无论如何,这似乎更可靠。您的代码很容易翻译成:

try
{
    // Something
}
catch (StorageException e)
{
    switch (e.RequestInformation.HttpStatusCode)
    {
        case (int)HttpStatusCode.NotFound:
        case (int)HttpStatusCode.PreconditionFailed:
        // Do something
    }
}

答案 1 :(得分:3)

我刚尝试过,并且惊讶地发现ExtendedErrorInformation对象确实是null。然而,它并不总是空的。例如,如果我尝试使用blobContainer.Create()方法创建一个已存在的blob容器,我将获得一个非null的ExtendedErrorInformation。但是,如果我尝试获取blob容器中不存在的blob的属性,我将得到一个null的ExtendedErrorInformation对象。我想不能只假设ExtendedErrorInformation对象总是可用。

另外我注意到在你的2.0代码中,你正在使用StorageErrorCodeStrings。请注意,它已从2.0中删除,仅适用于1.8或更早版本。以为我应该提一下

更新:请参阅以下@VollmonD的评论。这已在2.0.3版本中添加。

答案 2 :(得分:0)

晚会,但是如果你试图处理从blob中删除项目或只是检查它们是否存在(扩展方法有点接近)。 你现在可以使用:

点击此处查看CloudBlob上的方法列表:https://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storage.blob.cloudblockblob.aspx