处理适用于 Go 的 AWS SDK V2 中的错误 - 适用于 Go 的 AWS SDK v2

处理适用于 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.OperationError 错误类型进行封装。OperationError 提供与底层错误关联的服务名称和操作的上下文信息。这些信息对于采用集中式错误处理机制对一项或多项服务执行批量操作的应用程序非常有用。您的应用程序可以使用 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.ResponseError 并使用 ServiceRequestID() 方法来检索与错误响应关联的请求标识符。

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.ResponseError 并调用 ServiceRequestID()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 }