本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
错误处理
本节描述运行时系统错误,以及如何处理它们。它还描述特定于 Amazon Rekognition 的错误消息和代码。
错误组成部分
当程序发送一个请求时,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 SDK 负责将错误传播到应用程序,以便您能执行适当操作。例如,在 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."}
错误消息和代码
以下是 Amazon Rekognition 返回的异常列表,按 HTTP 状态代码分组。如果确定重试?为是,则可以在此提交相同请求。如果确定重试?为否,则需要先解决客户端问题,然后再提交新请求。
HTTP 状态代码 400
HTTP 400
状态代码表示与请求相关的问题。有些问题示例是关于身份验证失败、缺少必需参数或超出操作的预配置吞吐量。必须先解决应用程序中存在的问题,然后再重新提交请求。
- AccessDeniedException
-
消息:An error occurred (AccessDeniedException) when calling the <Operation> operation: User: <User ARN> is not authorized to perform: <Operation> on resource: <Resource ARN>. (调用 <操作> 操作时出错 (AccessDeniedException):用户 <用户 ARN> 无权对资源 <资源 ARN> 执行 <操作>。)
您无权执行该操作。使用授权用户或 IAM 角色的 Amazon 资源名称 (ARN) 来执行操作。
确定重试? 否
- GroupFacesInProgressException
-
消息:无法计划 GroupFaces 任务。此集合已经有 GroupFaces 任务。
在现有作业完成后重试该操作。
确定重试? 否
- IdempotentParameterMismatchException
-
消息:您提供的 ClientRequestToken <Token> 已在使用。
ClientRequestToken 输入参数与该操作一起重用,但至少有一个其他输入参数与先前对该操作的调用中的参数不同。
确定重试? 否
- ImageTooLargeException
-
消息:图像大小太大。
输入的图像尺寸超过允许的上限。如果您调用 DetectProtectiveEquipment,则图像大小或分辨率超过允许的限制。有关更多信息,请参阅Amazon Rekognition 中的准则和配额。
确定重试? 否
- InvalidImageFormatException
-
消息:请求具有无效的图像格式。
提供的图像格式不受支持。使用受支持的图像格式(.JPEG 和 .PNG)。有关更多信息,请参阅Amazon Rekognition 中的准则和配额。
确定重试? 否
- InvalidPaginationTokenException
-
消息
令牌无效
分页标记无效
请求中的分页标记无效。标记可能已过期。
确定重试? 否
- InvalidParameterException
-
消息:请求具有无效参数。
有一个输入参数违反了约束。先验证您的参数,然后重新调用 API 操作。
确定重试? 否
- InvalidS3ObjectException
-
消息:
请求具有无效的 S3 对象。
无法从 S3 获取对象元数据。请检查对象键、区域和/或访问权限。
Amazon Rekognition 无法访问请求中指定的 S3 对象。有关更多信息,请参阅配置对 S3 的访问:AWS S3 管理访问。有关问题排查信息,请参阅 Amazon S3 问题排查。
确定重试? 否
- LimitExceededException
消息:
超出账户的流处理器限制,限制 - <当前限制>。
用户 <用户 ARN> 具有 <打开的作业数> 个打开的作业,最大限制:<最大限制>
超出了 Amazon Rekognition 服务限制。例如,如果您并发启动了太多 Amazon Rekognition Video 作业,则调用启动操作(例如
StartLabelDetection
)会引发LimitExceededException
异常(HTTP 状态代码:400),直到并发运行的作业数量低于 Amazon Rekognition 服务限制。确定重试? 否
- ProvisionedThroughputExceededException
-
消息:
超出了预配置的速率。
超出了 S3 下载限制。
请求数超出了您的吞吐量限制。有关更多信息,请参阅 Amazon Rekognition 服务限制。
要请求提高限制,请按照 创建更改 TPS 配额的案例 中的说明进行操作。
确定重试? 是
- ResourceAlreadyExistsException
-
消息:集合 ID <集合 ID> 已存在。
具有指定 ID 的集合已存在。
确定重试? 否
- ResourceInUseException
-
消息:
流处理器名称已在使用。
指定的资源正在使用中。
处理器不可用于停止流。
无法删除流处理器。
在资源可用时重试。
确定重试? 否
- ResourceNotFoundException
-
消息:各个消息取决于 API 调用。
指定的资源不存在。
确定重试? 否
- VideoTooLargeException
-
消息:视频大小(以字节为单位) <视频大小> 已超出最大限制,即 <最大大小> 字节。
所提供媒体的文件大小或持续时间过大。有关更多信息,请参阅Amazon Rekognition 中的准则和配额。
确定重试? 否
HTTP 状态代码 5xx
HTTP 5xx
状态代码表示必须由 AWS 解决的问题。This might be a transient error。如果是临时错误,您可以重试请求,直到操作成功。否则,请转至 AWS 服务运行状况控制面板
应用程序中的错误处理
为了让应用程序平稳运行,您需要添加逻辑以捕获错误并做出响应。典型的方法包括使用 try-catch
块或 if-then
语句。
AWS SDK 可自行重试和检查错误。如果您在使用某个 AWS 开发工具包时遇到错误,错误代码和错误描述可帮助您纠正错误。
您还应该会在响应中看到 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
– 如果客户端无法从服务获得响应或者客户端无法解析来自服务的响应,会出现此异常。