我希望我的数据访问层能够处理由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
字段,因为我认为后者更精确。
答案 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,显示并发发生时可能出现的问题。