处理适用于 Go 的 AWS SDK V2 中的错误
适用于 Go 的 AWS SDK 返回满足 Go error 接口类型的错误。您可以使用 Error() 方法获取 SDK 错误消息的格式化字符串,无需进行任何特殊处理。SDK 返回的错误可能会实现 Unwrap 方法。SDK 使用 Unwrap 方法为错误提供额外的上下文信息,同时提供对底层错误或错误链的访问权限。应将 Unwrap 方法与 errors.As
调用一个可以返回 error 接口类型的函数或方法后,您的应用程序应检查是否出现了错误,这一点很重要。错误处理的最基本形式与以下示例类似:
if err != nil { // Handle error return }
日志记录错误
通常,最简单的错误处理形式是在返回或退出应用程序之前记录或打印错误消息。
import "log" // ... if err != nil { log.Printf("error: %s", err.Error()) return }
服务客户端错误
SDK 会将服务客户端返回的所有错误都用 smithy.OperationErrorOperationError 提供与底层错误关联的服务名称和操作的上下文信息。这些信息对于采用集中式错误处理机制对一项或多项服务执行批量操作的应用程序非常有用。您的应用程序可以使用 errors.As 访问此 OperationError 元数据。
import "log" import "github.com/aws/smithy-go" // ... if err != nil { var oe *smithy.OperationError if errors.As(err, &oe) { log.Printf("failed to call service: %s, operation: %s, error: %v", oe.Service(), oe.Operation(), oe.Unwrap()) } return }
API 错误响应
服务操作可以返回已建模的错误类型以指示特定错误。这些建模类型可以与 errors.As 结合使用,以展开并确定操作失败是否是由特定错误引起。例如,如果同名存储桶已经存在,Amazon S3 CreateBucket 可能会返回 BucketAlreadyExists
例如,检查错误是否为 BucketAlreadyExists 错误:
import "log" import "github.com/aws/aws-sdk-go-v2/service/s3/types" // ... if err != nil { var bne *types.BucketAlreadyExists if errors.As(err, &bne) { log.Println("error:", bne) } return }
所有服务 API 响应错误都实现了 smithy.APIError
import "log" import "github.com/aws/smithy-go" // ... if err != nil { var ae smithy.APIError if errors.As(err, &ae) { log.Printf("code: %s, message: %s, fault: %s", ae.ErrorCode(), ae.ErrorMessage(), ae.ErrorFault().String()) } return }
检索请求标识符
与 AWS Support 合作时,您可能需要提供请求标识符,以标识您正在尝试进行故障排除的请求。您可以使用 http.ResponseErrorServiceRequestID() 方法来检索与错误响应关联的请求标识符。
import "log" import awshttp "github.com/aws/aws-sdk-go-v2/aws/transport/http" // ... if err != nil { var re *awshttp.ResponseError if errors.As(err, &re) { log.Printf("requestID: %s, error: %v", re.ServiceRequestID(), re.Unwrap()); } return }
Amazon S3 请求标识符
Amazon S3 请求包含其他标识符,可用于帮助 AWS Support 对您的请求进行故障排除。您可以使用 s3.ResponseErrorServiceRequestID() 和 ServiceHostID() 来检索请求 ID 和主机 ID。
import "log" import "github.com/aws/aws-sdk-go-v2/service/s3" // ... if err != nil { var re s3.ResponseError if errors.As(err, &re) { log.Printf("requestID: %s, hostID: %s request failure", re.ServiceRequestID(), re.ServiceHostID()); } return }