

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

# 错误处理
<a name="error-handling"></a>

了解 适用于 Kotlin 的 AWS SDK 抛出异常的方式和时间对于使用 SDK 构建高质量的应用程序非常重要。接下来几节介绍开发工具包引发异常的几种不同情况，以及如何正确地处理这些异常。

## 服务异常
<a name="service-exceptions"></a>

最常见的例外是`AwsServiceException`，所有特定于服务的异常（例如`S3Exception`）都继承自该异常。该异常是指来自 AWS 服务的错误响应。例如，如果您尝试终止不存在的 Amazon EC2 实例，Amazon EC2 会返回错误响应。错误响应详细信息包含在抛出`AwsServiceException`的 that 中。

当您遇到时`AwsServiceException`，这意味着您的请求已成功发送到， AWS 服务 但无法处理。这可能是因为请求的参数中存在错误，或者是因为服务端的问题。

## 客户端异常
<a name="client-exceptions"></a>

`ClientException`表示 适用于 Kotlin 的 AWS SDK 客户端代码内部发生了问题，无论是在尝试向发送请求时 AWS 还是尝试解析来自 AWS的响应时。A `ClientException` 通常比 a 更严重`AwsServiceException`，表示主要问题是客户端无法处理对的服务调用 AWS 服务。例如，`ClientException`如果无法解析来自服务的响应，则会 适用于 Kotlin 的 AWS SDK 抛出 a。

## 错误元数据
<a name="error-metadata"></a>

每个服务异常和客户端异常都有该`sdkErrorMetadata`属性。这是一个键入的属性包，可用于检索有关错误的更多详细信息。

该`AwsErrorMetadata`类型有几个预定义的扩展名，包括但不限于以下扩展：
+ `sdkErrorMetadata.requestId`— 唯一的请求 ID
+ `sdkErrorMetadata.errorMessage`— 人类可读的消息（通常与匹配`Exception.message`，但如果服务未知异常，则可能包含更多信息）
+ `sdkErrorMetadata.protocolResponse`— 原始协议响应

以下示例演示如何访问错误元数据。

```
try {
    s3Client.listBuckets { ... }
} catch (ex: S3Exception) {
    val awsRequestId = ex.sdkErrorMetadata.requestId
    val httpResp = ex.sdkErrorMetadata.protocolResponse as? HttpResponse

    println("requestId was: $awsRequestId")
    println("http status code was: ${httpResp?.status}")
}
```