DocumentClientException.Error.Code有哪些值?

时间:2018-03-29 14:37:42

标签: exception-handling azure-cosmosdb azure-sdk-.net

我希望我的数据访问层能够处理由Microsoft.Azure.Documents.Client.DocumentClient类提供的DocumentDB API抛出的异常。例如,使用AccessCondition class实现乐观并发检查,但也使用其他。

通过查看引发的异常,识别不同DocumentClient特定异常的最佳方法似乎是这样的:

try { ... }
catch (DocumentClientException exception) 
    when (exception.Error.Code == "Some magic here")
{
    //let the user know how to recover from this..
}

我不喜欢这些神奇的字符串,因为它们不是可验证的编译时间。它可能会收缩一个拼写错误,或者随着DocumentDB客户端/服务器的更改等随机时刻发生变化等。另外,我不清楚哪些魔术代码可以/应该处理,因为我没有看到{{1包含任何Microsoft.Azure.DocumentDB枚举或常量的.net API,也不在文档中找到任何列表。

在哪里可以找到DocumentClient API可以抛出的ErrorCodes值列表?

为了让它更加令人困惑,Error.Code方法的XmlDoc建议改为使用http状态代码。

更新:这个问题不是关于Http状态代码,而是DocumentClient.CreateDocumentAsync字段,因为我认为后者更精确。

3 个答案:

答案 0 :(得分:1)

通过反编译1.22.0版客户端,将代码设置为HttpStatusCode枚举。我认为可以在https://msdn.microsoft.com/en-us/library/system.net.httpstatuscode(v=vs.110).aspx处找到所有可能的值。

但是,真正包含更丰富的调试信息的是Error.Message。可能需要反编译整个库才能弄清楚,或者等待微软发布源代码,因为github中的最新更新是2年前或3年前,这种情况不太可能发生。

public Error Error
{
    get
    {
        if (this.error == null)
        {
            this.error = new Error()
            {
                Code = this.StatusCode.ToString(),
                Message = this.Message
            };
        }
        return this.error;
    }
}

答案 1 :(得分:0)

有一个HTTP Status Codes for Azure Cosmos DB

列表

我在catch块中使用以下代码

    catch (DocumentClientException e)
            {
                var resp = new HttpResponseMessage
                {
                    StatusCode = (HttpStatusCode) e.StatusCode,
                    Content = new StringContent(e.Message)
                };
                return resp;
            }

应该在客户端应用程序上让用户知道如何处理异常。

答案 2 :(得分:0)

  

在哪里可以找到DocumentClient API可以抛出的可能错误代码值列表?

很难找到DocumentClinet API抛出的完整错误代码列表。例外情况取决于您的要求。

  

例如,乐观并发检查

Azure Cosmos DB使用 ETags 来处理乐观并发。

当我们从Azure Cosmos DB检索文档时,它总是包含一个ETag属性作为我们文档的一部分。

当我们想要发送替换文档的请求时,我们可以在获取文档时指定 AccessCondition with ETag

如果我们发送的ETag不是最新的,服务器将返回 412 Precondition Failed status code 。在我们的.NET SDK中,它包含在 DocumentClientException

这是一个example,显示并发发生时可能出现的问题。