You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:20:58