如何从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
相关产品推荐
相关产品推荐

