10

我正在从 WindowsAzure.StorageClient 1.7 迁移到 WindowsAzure.Storage 2.0,我现在正在处理异常的管理。遵循本指南和其他来源,我发现我必须从

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 环境中尝试,却把我逼到了同样的境地。

任何想法?

4

3 回答 3

8

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

try
{
    // Something
}
catch (StorageException e)
{
    switch (e.RequestInformation.HttpStatusCode)
    {
        case (int)HttpStatusCode.NotFound:
        case (int)HttpStatusCode.PreconditionFailed:
        // Do something
    }
}
于 2013-01-17T15:56:46.747 回答
3

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

我还注意到,在您的 2.0 代码中,您使用的是 StorageErrorCodeStrings。请注意,它已从 2.0 中删除,仅适用于 1.8 或更低版本。我想我应该提一下

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

于 2013-01-16T17:31:07.330 回答
0

聚会迟到了,但是如果您正在尝试处理从 blob 中删除项目或只是检查它们是否存在(扩展方法有点方法)。您现在可以使用:

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

于 2017-04-18T00:21:43.357 回答