我正在从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环境中尝试它会让我陷入同样的境地。
有什么想法吗?
答案 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.DeleteIfExistsAsync() - https://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storage.blob.cloudblockblob.deleteifexistsasync.aspx
CloudBlob.ExistsAsync() - https://msdn.microsoft.com/en-us/library/mt423366.aspx
点击此处查看CloudBlob上的方法列表:https://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storage.blob.cloudblockblob.aspx