

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

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

 本节描述运行时系统错误，以及如何处理它们。它还描述特定于 Amazon Rekognition 的错误消息和代码。

**Topics**
+ [错误组成部分](#error-handling.Components)
+ [错误消息和代码](#error-handling.MessagesAndCodes)
+ [应用程序中的错误处理](#error-handling.Handling)

## 错误组成部分
<a name="error-handling.Components"></a>

当程序发送一个请求时，Amazon Rekognition 会尝试处理该请求。如果请求成功，Amazon Rekognition 将返回一个 HTTP 成功状态代码（`200 OK`），以及所请求操作的结果。

如果该请求不成功，Amazon Rekognition 会返回一个错误。每个错误包含三个部分：
+ HTTP 状态代码（如 `400`）。
+ 异常名称（如 `InvalidS3ObjectException`）。
+ 错误消息（如 `Unable to get object metadata from S3. Check object key, region and/or access permissions.`）。

AWS SDKs 负责将错误传播到您的应用程序，以便您可以采取适当的措施。例如，在 Java 程序中，您可以编写 `try-catch` 逻辑以处理 `ResourceNotFoundException`。

如果您使用的不是 AWS SDK，将需要分析来自 Amazon Rekognition 的低级响应的内容。以下是此类响应的示例：

```
HTTP/1.1 400 Bad Request
Content-Type: application/x-amz-json-1.1
Date: Sat, 25 May 2019 00:28:25 GMT
x-amzn-RequestId: 03507c9b-7e84-11e9-9ad1-854a4567eb71
Content-Length: 222
Connection: keep-alive

{"__type":"InvalidS3ObjectException","Code":"InvalidS3ObjectException","Logref":"5022229e-7e48-11e9-9ad1-854a4567eb71","Message":"Unable to get object metadata from S3. Check object key, region and/or access permissions."}
```

## 错误消息和代码
<a name="error-handling.MessagesAndCodes"></a>

以下是 Amazon Rekognition 返回的异常列表，按 HTTP 状态代码分组。如果*确定重试？*为*是*，则可以在此提交相同请求。如果*确定重试？*为*否*，则需要先解决客户端问题，然后再提交新请求。

### HTTP 状态代码 400
<a name="error-handling.MessagesAndCodes.http400"></a>

HTTP `400` 状态代码表示与请求相关的问题。有些问题示例是关于身份验证失败、缺少必需参数或超出操作的预配置吞吐量。必须先解决应用程序中存在的问题，然后再重新提交请求。

**AccessDeniedException **  
消息：*调用操作时出错 (AccessDeniedException)：用户：无权在资源：上执行：。* <Operation><User ARN><Operation><Resource ARN>  
您无权执行该操作。使用授权用户或 IAM 角色的 Amazon 资源名称 (ARN) 来执行操作。  
确定重试？ 否

**GroupFacesInProgressException **  
消息：*无法安排 GroupFaces 作业。此集合已经有 GroupFaces 任务。*  
在现有作业完成后重试该操作。  
确定重试？ 否

**IdempotentParameterMismatchException **  
消息 * ClientRequestToken：您提供的:已在使用中。* <Token>  
 ClientRequestToken 输入参数已在操作中重复使用，但其他输入参数中至少有一个与之前对该操作的调用不同。  
确定重试？ 否

**ImageTooLargeException **  
消息：*图像大小太大。*  
输入的图像尺寸超过允许的上限。如果您正在呼叫 [DetectProtectiveEquipment](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_DetectProtectiveEquipment.html)，则图像大小或分辨率超过允许的限制。有关更多信息，请参阅 [Amazon Rekognition 中的准则和配额](limits.md)。  
确定重试？ 否

**InvalidImageFormatException **  
消息：*请求具有无效的图像格式。*  
提供的图像格式不受支持。使用受支持的图像格式（.JPEG 和 .PNG）。有关更多信息，请参阅 [Amazon Rekognition 中的准则和配额](limits.md)。  
确定重试？ 否

**InvalidPaginationTokenException **  
 消息  
+ *令牌无效*
+ *分页标记无效*
请求中的分页标记无效。标记可能已过期。  
确定重试？ 否 

**InvalidParameterException **  
消息：*请求具有无效参数。*  
有一个输入参数违反了约束。先验证您的参数，然后重新调用 API 操作。  
确定重试？ 否

**无效3 ObjectException **  
消息：  
+ *请求具有无效的 S3 对象。*
+ *无法从 S3 获取对象元数据。检查对象密钥、区域 and/or 访问权限。*
Amazon Rekognition 无法访问请求中指定的 S3 对象。有关更多信息，请参阅[配置对 S3 的访问：AWS S3 管理访问](https://docs.aws.amazon.com/AmazonS3/latest/dev/s3-access-control.html)。有关问题排查信息，请参阅 [Amazon S3 问题排查](https://docs.aws.amazon.com/AmazonS3/latest/dev/troubleshooting.html)。  
确定重试？ 否

**LimitExceededException **  
消息：  
+ *超出账户的流处理器限制，限制 - <当前限制>。*
+ *用户 <用户 ARN> 具有 <打开的作业数> 个打开的作业，最大限制：<最大限制>*
超出了 Amazon Rekognition 服务限制。例如，如果您并发启动了太多 Amazon Rekognition Video 作业，则调用启动操作（例如 `StartLabelDetection`）会引发 `LimitExceededException` 异常（HTTP 状态代码：400），直到并发运行的作业数量低于 Amazon Rekognition 服务限制。  
确定重试？ 否

**ProvisionedThroughputExceededException **  
消息：  
+ *超出了预配置的速率。*
+ *超出了 S3 下载限制。*
请求数超出了您的吞吐量限制。有关更多信息，请参阅 [Amazon Rekognition 服务限制](https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html#limits_rekognition)。  
要请求提高限制，请按照 [创建更改 TPS 配额的案例](limits.md#quotas-create-case) 中的说明进行操作。  
确定重试？ 是

**ResourceAlreadyExistsException **  
消息：*集合 ID <集合 ID> 已存在。*  
 具有指定 ID 的集合已存在。  
确定重试？ 否

**ResourceInUseException **  
消息：  
+ *流处理器名称已在使用。*
+ *指定的资源正在使用中。*
+ *处理器不可用于停止流。*
+ *无法删除流处理器。*
在资源可用时重试。  
确定重试？ 否

**ResourceNotFoundException **  
消息：各个消息取决于 API 调用。  
指定的资源不存在。  
确定重试？ 否

**ThrottlingException **  
消息：*减慢；请求速率突然增加。*  
您的请求速率增加过快。减慢您的请求速率并逐渐提高它。我们建议您进行指数回退并重试。默认情况下， AWS SDKs 使用自动重试逻辑和指数退避。有关更多信息，请参阅 AWS 中的[错误重试和指数回退](https://docs.aws.amazon.com/general/latest/gr/api-retries.html)和[指数回退和抖动](http://www.awsarchitectureblog.com/2015/03/backoff.html)。  
确定重试？ 是

**VideoTooLargeException **  
消息：*视频大小（以字节为单位） <视频大小> 已超出最大限制，即 <最大大小> 字节。*  
所提供媒体的文件大小或持续时间过大。有关更多信息，请参阅 [Amazon Rekognition 中的准则和配额](limits.md)。  
确定重试？ 否

### HTTP 状态代码 5xx
<a name="error-handling.MessagesAndCodes.http5xx"></a>

HTTP `5xx` 状态代码表示必须由 AWS解决的问题。This might be a transient error。如果是临时错误，您可以重试请求，直到操作成功。否则，请转至 [AWS 服务运行状况控制面板](https://status.aws.amazon.com/)以查看是否存在与服务相关的任何操作问题。

**InternalServerError (HTTP 500) **  
消息：*Internal server error (内部服务器错误)*  
Amazon Rekognition 遇到了一个服务问题。重新尝试您的调用。您应该执行指数级退避并重试。默认情况下， AWS SDKs 使用自动重试逻辑和指数退避。有关更多信息，请参阅 AWS 中的[错误重试和指数回退](https://docs.aws.amazon.com/general/latest/gr/api-retries.html)和[指数回退和抖动](http://www.awsarchitectureblog.com/2015/03/backoff.html)。  
确定重试？ 是

**ThrottlingException (HTTP 500)**  
消息：*服务不可用*  
Amazon Rekognition 暂时无法处理该请求。重新尝试您的调用。我们建议您进行指数回退并重试。默认情况下， AWS SDKs 使用自动重试逻辑和指数退避。有关更多信息，请参阅 AWS 中的[错误重试和指数回退](https://docs.aws.amazon.com/general/latest/gr/api-retries.html)和[指数回退和抖动](http://www.awsarchitectureblog.com/2015/03/backoff.html)。  
确定重试？ 是

## 应用程序中的错误处理
<a name="error-handling.Handling"></a>

为了让应用程序平稳运行，您需要添加逻辑以捕获错误并做出响应。典型的方法包括使用 `try-catch` 块或 `if-then` 语句。

AWS 自行 SDKs 执行重试和错误检查。如果您在使用其中一个 AWS 时遇到错误 SDKs，则错误代码和描述可以帮助您排除故障。

您还应该会在响应中看到 `Request ID`。如果您需要使用 AWS Support 来诊断问题，则 `Request ID` 会很有用。

以下 Java 代码段尝试检测图像中的对象并执行基本错误处理。（在这种情况下，它会向用户告知请求失败。） 

```
try {
    DetectLabelsResult result = rekognitionClient.detectLabels(request);
    List <Label> labels = result.getLabels();

    System.out.println("Detected labels for " + photo);
    for (Label label: labels) {
        System.out.println(label.getName() + ": " + label.getConfidence().toString());
    }
} 
catch(AmazonRekognitionException e) {
    System.err.println("Could not complete operation");
    System.err.println("Error Message:  " + e.getMessage());
    System.err.println("HTTP Status:    " + e.getStatusCode());
    System.err.println("AWS Error Code: " + e.getErrorCode());
    System.err.println("Error Type:     " + e.getErrorType());
    System.err.println("Request ID:     " + e.getRequestId());
}
catch (AmazonClientException ace) {
    System.err.println("Internal error occurred communicating with Rekognition");
    System.out.println("Error Message:  " + ace.getMessage());
}
```

在此代码段中，`try-catch` 结构处理两种不同的异常：
+ `AmazonRekognitionException` – 如果客户端请求正确地传输到 Amazon Rekognition，但 Amazon Rekognition 无法处理请求并返回错误响应，会出现此异常。
+ `AmazonClientException` – 如果客户端无法从服务获得响应或者客户端无法解析来自服务的响应，会出现此异常。