

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 處理 適用於 Go 的 AWS SDK V2 中的錯誤
<a name="handle-errors"></a>

 適用於 Go 的 AWS SDK 會傳回滿足 Go `error` 介面類型的錯誤。您可以使用 `Error()`方法取得 SDK 錯誤訊息的格式化字串，無需任何特殊處理。開發套件傳回的錯誤可能會實作 `Unwrap`方法。軟體開發套件會使用 `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>

 開發套件使用 [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
}
```