如何在C#中识别Cosmos DB存储过程抛出的自定义错误类型
如何在C#端识别Cosmos DB存储过程抛出的自定义错误信息
我刚好处理过类似的场景,要实现从C#端获取存储过程抛出的自定义错误码和信息,需要调整存储过程的错误抛出方式,再在C#端做针对性解析,具体步骤如下:
1. 调整存储过程的错误抛出逻辑
Cosmos DB的存储过程执行引擎对直接抛出的普通对象处理有限,会将其转换为通用错误信息。正确的做法是将自定义错误对象序列化为JSON字符串,塞进Error对象的message属性中抛出:
function yourStoredProcedure() { // 模拟业务错误场景 const customError = { Code: 1, Text: "Some text describing the error" }; // 将自定义错误序列化为JSON字符串,作为Error的message抛出 throw new Error(JSON.stringify(customError)); }
2. C#端捕获并解析自定义错误
当存储过程抛出错误时,C#端会收到DocumentClientException(旧版SDK)或CosmosException(新版SDK),状态码为400。我们需要从异常的响应体中解析出存储过程返回的自定义错误信息:
示例代码(旧版SDK,使用Newtonsoft.Json)
using Newtonsoft.Json; using System.Net; using Microsoft.Azure.Documents.Client; try { // 执行存储过程 var sprocUri = UriFactory.CreateStoredProcedureUri("YourDatabaseId", "YourContainerId", "YourStoredProcedureId"); var response = await documentClient.ExecuteStoredProcedureAsync<dynamic>(sprocUri); } catch (DocumentClientException ex) { if (ex.StatusCode == HttpStatusCode.BadRequest) { // 首先解析Cosmos返回的外层错误结构 var cosmosError = JsonConvert.DeserializeObject<CosmosErrorResponse>(ex.ResponseBody); // 再从外层错误的Message中解析我们的自定义错误 var customError = JsonConvert.DeserializeObject<CustomError>(cosmosError.Message); // 现在可以获取自定义错误码和信息了 Console.WriteLine($"自定义错误码:{customError.Code},错误信息:{customError.Text}"); } } // 定义对应的实体类 public class CosmosErrorResponse { public string Message { get; set; } // 可根据实际响应添加其他属性,如 StatusCode、ActivityId 等 } public class CustomError { public int Code { get; set; } public string Text { get; set; } }
新版SDK(Azure.Cosmos包)适配提示
如果使用新版SDK,异常类型为CosmosException,需要从ResponseMessage.Content读取响应体:
using Azure.Cosmos; using System.Text.Json; // ... catch (CosmosException ex) { if (ex.StatusCode == HttpStatusCode.BadRequest) { var responseBody = await ex.ResponseMessage.Content.ReadAsStringAsync(); var cosmosError = JsonSerializer.Deserialize<CosmosErrorResponse>(responseBody); var customError = JsonSerializer.Deserialize<CustomError>(cosmosError.Message); // 后续处理逻辑一致 } }
关键注意事项
- 必须使用
Error对象抛出:直接抛普通对象会被Cosmos引擎包装成通用错误,无法保留自定义信息; - JSON序列化要准确:确保存储过程中
JSON.stringify的对象格式正确,避免解析失败; - 响应体结构可能微调:不同SDK版本或Cosmos DB配置下,外层错误结构可能略有差异,可根据实际返回的JSON调整
CosmosErrorResponse类的属性。
内容的提问来源于stack exchange,提问作者yngling
相关产品推荐
相关产品推荐

