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

如何从RequestFailedException获取错误详细信息

新版Azure SDK RequestFailedException 错误信息提取方案

旧版Microsoft.WindowsAzure.Storage下的StorageException确实在新版SDK中统一替换为了RequestFailedException,原RequestInformation封装的属性没有消失,只是调整了暴露方式,不存在SDK功能缺失的问题,字段映射和实现方式如下:

核心字段直接映射

RequestFailedException把原嵌套在RequestInformation里的高频使用字段做成了一级公开属性,可直接访问:

  • 原RequestInformation.ServiceRequestID → 对应异常的RequestId属性,字符串类型
  • 原RequestInformation.HttpStatusCode → 对应异常的Status属性,int类型,即标准HTTP状态码
  • 原RequestInformation.ErrorCode → 对应异常的ErrorCode属性,字符串类型,即存储服务返回的业务错误码,比如TableNotFound
  • 原RequestInformation.HttpStatusMessage → 可从原始响应的ReasonPhrase属性,或异常的Data字典中获取

扩展错误信息获取方式

原ExtendedErrorInformation下的自定义错误字段没有做统一的强类型封装,可通过两个渠道获取:

  • 异常自带的Data字典:SDK会把预解析出的扩展错误字段自动存在这个键值对集合里,比如HttpStatusMessage、ErrorMessage、x-ms-error-code等
  • 调用异常的GetRawResponse()方法:拿到原始HTTP响应对象,可读取完整响应头、响应内容,作为兜底方案获取全量信息,比旧版ExtendedErrorInformation覆盖的信息更全

迁移后代码示例

场景1:记录请求ID的逻辑迁移

catch (RequestFailedException e)
{
    operation.Telemetry.Properties.Add("AzureServiceRequestID", e.RequestId);
}

场景2:错误码判断+全量日志记录的逻辑迁移

catch (RequestFailedException se)
{
    // 读取一级公开属性
    var httpStatusCode = se.Status;
    var serviceErrorCode = se.ErrorCode;
    string httpStatusMessage = null;
    string extendedErrorCode = null;
    string extendedErrorMessage = null;

    // 优先从Data字典读取预解析的扩展字段
    if (se.Data.Contains("HttpStatusMessage"))
        httpStatusMessage = se.Data["HttpStatusMessage"]?.ToString();
    if (se.Data.Contains("x-ms-error-code"))
        extendedErrorCode = se.Data["x-ms-error-code"]?.ToString();
    if (se.Data.Contains("ErrorMessage"))
        extendedErrorMessage = se.Data["ErrorMessage"]?.ToString();

    // 原始响应当兜底,补全缺失字段
    if (se.GetRawResponse() is { } response)
    {
        httpStatusMessage ??= response.ReasonPhrase;
        // 从响应头补全请求ID、错误码
        if (string.IsNullOrEmpty(se.RequestId) && response.Headers.TryGetValue("x-ms-request-id", out var reqId))
            se.RequestId = reqId;
        extendedErrorCode ??= response.Headers.TryGetValue("x-ms-error-code", out var errCode) ? errCode : null;
        // 需要完整错误响应体时,可直接读取response.Content做JSON解析
    }

    if (serviceErrorCode == "TableNotFound")
    {
        Logger.Info(
            $"{SJResult.MakeInfo(64)} {httpStatusCode} {httpStatusMessage}, Storage Service code={serviceErrorCode} This is OK if HL7 has not yet received messages."); // 60240040
    }
    else
    {
        Logger.Error(
            $"{SJResult.MakeError(65)} HttpStatusCode: {httpStatusCode}, HttpStatusMessage: {httpStatusMessage}, Storage Service code={serviceErrorCode}, " +
            $"Extended.ErrorCode: {extendedErrorCode} Extended.ErrorMessage: {extendedErrorMessage}"); // E0240041 
        throw;
    }
}

补充说明

  • 新版Azure SDK统一了所有服务的异常类型为RequestFailedException,不再为单个存储服务单独封装异常类,因此去掉了旧版强类型的RequestInformation嵌套结构,改为通用属性+原始响应开放的设计,适配Blob、队列、表、文件等所有存储服务
  • 上述取数方式兼容Azure.Data.Tables、Azure.Storage.Queues、Azure.Storage.Blobs所有新版存储SDK,不会出现字段遗漏的问题

内容的提问来源于stack exchange,提问作者Dennis Jones

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 23:30:09