

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 处理适用于 Go 的 AWS SDK V2 中的错误
<a name="handle-errors"></a>

 适用于 Go 的 AWS SDK 返回满足 Go `error` 接口类型的错误。您可以使用 `Error()` 方法获取 SDK 错误消息的格式化字符串，无需进行任何特殊处理。SDK 返回的错误可能会实现 `Unwrap` 方法。SDK 使用 `Unwrap` 方法为错误提供额外的上下文信息，同时提供对底层错误或错误链的访问权限。应将 `Unwrap` 方法与 [errors.As](https://golang.org/pkg/errors#As) 结合使用以处理展开错误链。

 调用一个可以返回 `error` 接口类型的函数或方法后，您的应用程序应检查是否出现了错误，这一点很重要。错误处理的最基本形式与以下示例类似：

```
if err != nil {
    // Handle error
    return
}
```

## 日志记录错误
<a name="logging-errors"></a>

 通常，最简单的错误处理形式是在返回或退出应用程序之前记录或打印错误消息。

```
import "log"

// ...

if err != nil {
    log.Printf("error: %s", err.Error())
    return
}
```

## 服务客户端错误
<a name="service-client-errors"></a>

 SDK 会将服务客户端返回的所有错误都用 [smithy.OperationError](https://pkg.go.dev/github.com/aws/smithy-go#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 错误响应
<a name="api-error-responses"></a>

 服务操作可以返回已建模的错误类型以指示特定错误。这些建模类型可以与 `errors.As` 结合使用，以展开并确定操作失败是否是由特定错误引起。例如，如果同名存储桶已经存在，Amazon S3 `CreateBucket` 可能会返回 [BucketAlreadyExists](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/s3/types#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](https://pkg.go.dev/github.com/aws/smithy-go/#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
}
```

## 检索请求标识符
<a name="retrieving-request-identifiers"></a>

 与 AWS Support 合作时，您可能需要提供请求标识符，以标识您正在尝试进行故障排除的请求。您可以使用 [http.ResponseError](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/aws/transport/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 请求标识符
<a name="s3-request-identifiers"></a>

 Amazon S3 请求包含其他标识符，可用于帮助 AWS Support 对您的请求进行故障排除。您可以使用 [s3.ResponseError](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/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
}
```