

终止支持通知：2025 年 11 月 13 日， AWS 我们将停止对亚马逊 Elastic Transcoder 的支持。2025 年 11 月 13 日之后，您将无法再访问 Elastic Transcoder 控制台或 Elastic Transcoder 资源。

有关过渡到的更多信息 AWS Elemental MediaConvert，请访问此[博客文章](https://aws.amazon.com/blogs/media/how-to-migrate-workflows-from-amazon-elastic-transcoder-to-aws-elemental-mediaconvert/)。

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

# 处理 Elastic Transcoder 中的错误
<a name="error-handling"></a>

**Topics**
+ [API 错误代码（客户端错误和服务器错误）](#api-error-codes)
+ [处理任务过程中出现错误](#job-processing-errors)
+ [抓取错误](#catching-errors)
+ [错误重试和指数回退](#api-retries)

当您通过 Elastic Transcoder API 发送请求和获取响应时，可能会遇到两种 API 错误：
+ **客户端错误：**客户端错误由 4xx 形式的 HTTP 响应代码表示。客户端错误表明 Elastic Transcoder 发现客户端请求存在问题，例如身份验证失败或缺少必需参数。请修复客户端应用程序中存在的问题后再重新提交请求。
+ **服务器错误：**服务器错误由 5xx 形式的 HTTP 响应代码表示，这种错误需要由 Amazon 解决。您可以重新提交/重试请求，直到操作成功。

对于每个 API 错误，Elastic Transcoder 将返回以下值：
+ 状态代码（例如，`400`）
+ 错误代码（例如，`ValidationException`）
+ 错误消息（例如，`Supplied AttributeValue is empty, must contain exactly one of the supported datatypes`）

有关 Elastic Transcoder 针对客户端错误和服务器错误返回的错误代码的列表，请参阅 [API 错误代码（客户端错误和服务器错误）](#api-error-codes)。

此外，Elastic Transcoder 处理您的任务时可能会遇到错误。有关更多信息，请参阅 [处理任务过程中出现错误](#job-processing-errors)。

## API 错误代码（客户端错误和服务器错误）
<a name="api-error-codes"></a>

HTTP 状态代码可以指明某一操作是否成功。

如果响应代码为 `200`，则表明操作成功。其他错误代码表示客户端错误 (4xx) 或服务器错误 (5xx)。

下表列出了 Elastic Transcoder 返回的错误。某些错误只需重试同一请求即可解决。此表中会指出哪些错误只需连续重试就有可能解决。如果“重试”列的值为：
+ **是**：再次提交同一请求。
+ **否**：修复客户端的问题，然后再提交新请求。

有关重试请求的更多信息，请参阅 [错误重试和指数回退](#api-retries)。


| HTTP 状态代码 | 错误代码 | 消息 | 原因 | 重试 | 
| --- | --- | --- | --- | --- | 
| 400 | 条件检查失败异常 | 有条件请求失败。 | 示例：预期值与系统中存储的值不匹配。 | 否 | 
| 400 | 签名不完整异常 | 请求签名不符合 AWS 标准。 | 请求中的签名未包含所有必需的组件。请参阅 [HTTP 标头内容](making-http-requests.md#http-request-header)。 | 否 | 
| 403 | 缺少身份验证令牌异常 | 请求必须包含有效（已注册）的 AWS 访问密钥 ID。 | 请求未包含所需的 x-amz-security-token。请参阅 [向 Elastic Transcoder 发出 HTTP 请求](making-http-requests.md)。 | 否 | 
| 400 | 验证异常 | 多种。 | 请求中的一个或多个值缺失或无效；例如，值为空或大于最大有效值。 | 否 | 
| 403 | AccessDenied 例外 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/elastictranscoder/latest/developerguide/error-handling.html)  |  您尝试删除系统预设，Elastic Transcoder API 调用中的签名无效，或用户的凭证未获得执行该操作的授权。  | 否 | 
| 404 | ResourceNot 发现异常  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/elastictranscoder/latest/developerguide/error-handling.html)  | 示例：您尝试为其添加任务的管道不存在或仍在创建中。 | 否 | 
| 409 | 资源 InUse 异常 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/elastictranscoder/latest/developerguide/error-handling.html)  | 示例：您尝试删除当前正在使用中的管道。 | 否 | 
| 429 | 超出限制异常  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/elastictranscoder/latest/developerguide/error-handling.html)  | 当前 AWS 账户已超出 Elastic Transcoder 对象的限制。有关更多信息，请参阅 [Elastic Transcoder 管道、任务和预设的数量限制](limits.md)。 |  | 
| 429 | 超出预配置吞吐量异常 | 超出预配置吞吐量上限。 |  示例：您的请求速率过高。AWS fo SDKs r Elastic Transcoder 会自动重试收到此异常的请求。除非您的重试队列太长以致无法完成，您的请求最终都会成功。请降低请求频率。有关更多信息，请参阅 [错误重试和指数回退](#api-retries)。 如果您通过轮询来确定请求的状态，请考虑使用通知来确定状态。有关更多信息，请参阅 [任务状态通知](notifications.md)。  | 是 | 
| 429 | 限制异常 | 请求速率超出吞吐量上限。 |  您提交请求的速度太快；例如，创建新任务的请求。 如果您通过轮询来确定请求的状态，请考虑使用通知来确定状态。有关更多信息，请参阅 [任务状态通知](notifications.md)。  | 是 | 
| 500 | 内部故障 | 服务器在尝试完成请求时遇到内部错误。 | 服务器在处理您的请求时遇到错误。 | 是 | 
| 500 | Internal Server Error | 服务器在尝试完成请求时遇到内部错误。 | 服务器在处理您的请求时遇到错误。 | 是 | 
| 500 | 内部服务异常 |  | 服务在尝试完成请求时遇到意外异常。 | 是 | 
| 500 | 服务不可用异常  | 服务目前不可用或繁忙。 | 服务器在处理您的请求时出现意外错误。 | 是 | 

### 错误响应示例
<a name="sample-http-error-response"></a>

下面是一个 HTTP 响应，它表示 `inputBucket` 的值为 null (非有效值)。

```
HTTP/1.1 400 Bad Request
x-amzn-RequestId: b0e91dc8-3807-11e2-83c6-5912bf8ad066
x-amzn-ErrorType: ValidationException
Content-Type: application/json
Content-Length: 124
Date: Mon, 26 Nov 2012 20:27:25 GMT

{"message":"1 validation error detected: Value null at 'inputBucket' failed to satisfy constraint: Member must not be null"}
```

## 处理任务过程中出现错误
<a name="job-processing-errors"></a>

当 Elastic Transcoder 在处理任务过程中遇到错误时，它会通过两种方式报告错误：
+ **任务状态和输出状态：**Elastic Transcoder 会将失败输出的 `Job:Status` 对象和 `Outputs:Status` 对象设置为 `Error`。此外，Elastic Transcoder 会将失败输出的 `Outputs:StatusDetail` JSON 对象设置为用于说明故障的值。
+ **SNS 通知：**如果您将管道配置为 Elastic Transcoder 在处理过程中遇到错误时发送 SNS 通知，Elastic Transcoder 会在通知中使用以下格式包含一个 JSON 对象：

  ```
  {
     "state" : "PROGRESSING|COMPLETED|WARNING|ERROR",
     "errorCode" : "the code of any error that occurred",
     "messageDetails" : "the notification message you created in Amazon SNS",
     "version" : "API version that you used to create the job",
     "jobId" : "value of Job:Id object that Elastic Transcoder 
               returns in the response to a Create Job request",
     "pipelineId" : "value of PipelineId object 
                    in the Create Job request",
     "input" : {
        job Input settings
     },
     "outputKeyPrefix" : "prefix for file names in Amazon S3 bucket",
     "outputs": [
        {
           applicable job Outputs settings,
           "status" : "Progressing|Complete|Warning|Error"
        },
        {...}
     ],
     "playlists": [
        {
           applicable job playlists settings
        }
     ],
     "userMetadata": {
        "metadata key": "metadata value"
     }
  }
  ```


| `errorCode` 的值 | `messageDetails` 的值 | 原因 | 
| --- | --- | --- | 
| 1000 | 验证错误 | 在处理任务时，Elastic Transcoder 确定请求中的一个或多个值无效。 | 
| 1001 | 依赖性错误 | Elastic Transcoder 无法生成播放列表，因为它的一个或多个播放列表依赖项遇到错误。 | 
| 2000 | 无法代入角色 | Elastic Transcoder 无法担任 AWS Identity and Access Management 此任务在管道Role中的对象中指定的角色。 | 
| 3000 | 未分类存储错误 |  | 
| 3001 | 输入不存在 | 不存在具有您在该任务的 Input:Key 对象中指定的名称的文件。该文件必须存在于在管道的 InputBucket 对象中为该任务指定的 Amazon S3 存储桶中。 | 
| 3002 | 输出已存在 | 已存在具有您在该任务的 Outputs:Key（或 Output:Key）对象中指定的名称的文件。该文件不能存在于在管道的 OutputBucket 对象中为该任务指定的 Amazon S3 存储桶中。 | 
| 3003 | 没有读取权限 | 在用于该任务的管道的 Role 对象中所指定的 IAM 角色没有读取其中包含要转码的文件的 Amazon S3 存储桶的权限。 | 
| 3004 | 没有写入权限 | 在用于该任务的管道的 Role 对象中所指定的 IAM 角色没有要在其中保存已转码文件或缩略图文件的 Amazon S3 存储桶的写入权限。 | 
| 3005 | 存储桶不存在 | 指定的 S3 存储桶不存在：存储桶=\$11\$1。 | 
| 3006 | 没有写入权限 | Elastic Transcoder 无法将密钥=\$11\$1 写入到存储桶=\$12\$1 中，因为密钥与存储桶不在相同区域中 | 
| 4000 | 错误输入文件 | 您在该任务的 Input:Key 对象中所指定文件的格式当前不受 Elastic Transcoder 的支持。 | 
| 4001 | 错误输入文件 | 您在该任务的 Input:Key 对象中所指定文件的宽度 x 高度超出允许的最大宽度 x 高度。 | 
| 4002 | 错误输入文件 | 您在该任务的 Input:Key 对象中所指定文件的文件大小超出允许的最大文件大小。 | 
| 4003 | 错误输入文件 | Elastic Transcoder 无法解释您在该任务的其中一个 Outputs:Watermarks:InputKey 对象中指定的文件。 | 
| 4004 | 错误输入文件 | 您在该任务的其中一个 Outputs:Watermarks:InputKey 对象中所指定文件的宽度 x 高度超出允许的最大宽度 x 高度。 | 
| 4005 | 错误输入文件 | 您为其中一个 \$11\$1 对象指定的文件的大小超出允许的最大大小：存储桶=\$12\$1，密钥=\$13\$1，大小=\$14\$1，最大大小=\$15\$1。 | 
| 4006 | 错误输入文件 | Elastic Transcoder 无法将输入文件转码，因为格式不受支持。 | 
| 4007 | 未处理的输入文件 | Elastic Transcoder 遇到通常支持的文件类型，但无法正确处理该文件。此错误会自动打开一个支持案例，我们已开始研究问题的原因。 | 
| 4008 | 错误输入文件 |  该问题的根本原因是预设和输入文件不匹配。示例包括： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/elastictranscoder/latest/developerguide/error-handling.html)  | 
| 4009 | 错误输入文件 | Elastic Transcoder 无法将所有专辑封面插入输出文件中，因为已超出最大数量的艺术作品流。 | 
| 4010 | 错误输入文件 | Elastic Transcoder 无法解释您为 AlbumArt:Artwork:InputKey 指定的图像文件。 | 
| 4011 | 错误输入文件 | Elastic Transcoder 检测到嵌入式艺术作品流，但无法解释它。 | 
| 4012 | 错误输入文件 | 为 AlbumArt:Artwork 指定的图像超出允许的最大宽度 x 高度：4096 x 3072。 | 
| 4013 | 错误输入文件 | 嵌入式插图的宽度 x 高度超出允许的最大宽度 x 高度：4096 x 3072。 | 
| 4014 | 错误输入 | 为剪辑开始时间指定的值晚于输入文件的结束时间。Elastic Transcoder 无法创建输出文件。 | 
| 4015 | 错误输入 | Elastic Transcoder 无法生成清单文件，因为生成的段不匹配。 | 
| 4016 | 错误输入 | Elastic Transcoder 无法使用 \$12\$1 将来自 \$11\$1 的输入文件解密。 | 
| 4017 | 错误输入 | AES 密钥使用 \$12\$1 位加密密钥进行加密。AES 仅支持 128 位、192 位和 256 位加密密钥。 MD5= \$11\$1。 | 
| 4018 | 错误输入 | Elastic Transcoder 无法使用 = \$11\$1 解密加密的密钥 MD5 | 
| 4019 | 错误输入 | Elastic Transcoder 无法使用 KMS 密钥 ARN \$10\$1 生成数据密钥。 | 
| 4020 | 错误输入 | 您的密钥必须为 128 位才能进行 AES-128 加密。 MD5= \$11\$1，\$12\$1 位。 | 
| 4021 | 错误输入 | 您的密钥必须为 128 位才能进行 D PlayReady RM。 MD5= \$11\$1，强度= \$12\$1 位。 | 
| 4022 | 错误输入 | \$11\$1 所指定媒体文件的组合大小超出允许的最大大小：存储桶=\$12\$1，大小=\$13\$1。 | 
| 4023 | 错误输入 | 指定要联接的 \$11\$1 输入文件不会使用与指定预设一致的分辨率创建输出。使用具有不同 PaddingPolicy、SizingPolicy、MaxWidth 和 MaxHeight 设置的预设。 | 
| 4024 | 错误输入 | 指定要联接的 \$11\$1 输入文件不会使用与指定预设一致的分辨率创建缩略图。使用具有不同缩略图 PaddingPolicy、SizingPolicy、MaxWidth 和 MaxHeight 设置的预设。 | 
| 4025 | 错误输入 | 至少有一个媒体文件（输入 \$1\$11\$1）与其他文件不匹配。所有媒体文件必须都包含视频或都不包含视频。 | 
| 4026 | 错误输入 | 至少有一个媒体文件（输入 \$1\$11\$1）与其他文件不匹配。所有媒体文件必须都包含音频或都不包含音频。 | 
| 4100 | 错误输入文件 | Elastic Transcoder 检测到嵌入的字幕轨迹，但无法解释它。 | 
| 4101 | 错误输入文件 | Elastic Transcoder 无法解释为 Amazon S3 存储桶=\$11\$1、密钥=\$12\$1 指定的字幕文件。 | 
| 4102 | 错误输入文件 | Elastic Transcoder 无法解释指定的字幕文件，因为它不是 UTF-8 编码：Amazon S3 存储桶=\$11\$1，密钥=\$12\$1。 | 
| 4103 | 错误输入文件 | Elastic Transcoder 无法处理所有字幕轨迹，因为已超出字幕轨迹的最大数量 \$11\$1。 | 
| 4104 | 错误输入文件 | Elastic Transcoder 无法生成主播放列表，因为所需的输出包含 \$11\$1 个嵌入式字幕，而最大值为 4。 | 
| 4105 | 错误输入文件 | Elastic Transcoder 无法嵌入字幕轨迹，因为对于 CEA-708 不支持帧速率 \$11\$1，仅支持帧速率 [29.97, 30]。 | 
| 4106 | 错误输入文件 | Elastic Transcoder 无法嵌入字幕轨迹，因为格式 \$11\$1 仅支持 \$12\$1 个字幕轨迹。 | 
| 9000 | 内部服务错误 |  | 
| 9001 | 内部服务错误 |  | 
| 9999 | 内部服务错误 |  | 

## 抓取错误
<a name="catching-errors"></a>

为了让您的应用程序平稳运行，您需要构建逻辑以捕获和响应错误。一种典型的方法是在 `try` 数据块或 `if-then` 语句中实施您的请求。

AWS 自行 SDKs 执行重试和错误检查。如果您在使用其中一个 AWS 时遇到错误 SDKs，则应看到错误代码和描述。您还会看到一个 `Request ID` 值。`Request ID` 值可以帮助 Elastic Transcoder 支持人员排除错误。

以下示例使用适用于 Java 的 AWS SDK 删除 `try` 数据块中的一个项目，并使用 `catch` 数据块就错误给出响应。在本示例中，系统会发出请求失败的警告。该示例使用 `AmazonServiceException` 类检索有关操作错误的信息（包括 `Request ID`）。该示例还使用了 `AmazonClientException` 类，以处理请求因其他原因失败的情况。

```
try {
   DeleteJobRequest request = new DeleteJobRequest(jobId);
   DeleteJobResult result = ET.deleteJob(request);
   System.out.println("Result: " + result);
   // Get error information from the service while trying to run the operation	
   }  catch (AmazonServiceException ase) {
      System.err.println("Failed to delete job " + jobId);
      // Get specific error information
      System.out.println("Error Message:    " + ase.getMessage());
      System.out.println("HTTP Status Code: " + ase.getStatusCode());
      System.out.println("AWS Error Code:   " + ase.getErrorCode());
      System.out.println("Error Type:       " + ase.getErrorType());
      System.out.println("Request ID:       " + ase.getRequestId());
   // Get information in case the operation is not successful for other reasons	
   }  catch (AmazonClientException ace) {
      System.out.println("Caught an AmazonClientException, which means"+
      " the client encountered " +
      "an internal error while trying to " +
      "communicate with Elastic Transcoder, " +
      "such as not being able to access the network.");
      System.out.println("Error Message: " + ace.getMessage());
   }
```

## 错误重试和指数回退
<a name="api-retries"></a>

网络上的大量组件 (例如 DNS 服务器、交换机、负载均衡器等) 都可能在某个指定请求生命周期中的任一环节出现问题。

在联网环境中，处理这些错误响应的常规技术是在客户应用程序中实施重试。该技术可以提高应用程序的可靠性和降低开发人员的操作成本。

每个支持 Elastic Transcoder 的 AWS SDK 都将实施自动重试逻辑。适用于 Java 的 AWS SDK 会自动重试请求，您可以使用 `ClientConfiguration` 类配置重试设置。例如，有时候网页发出的请求采用最低延迟并且不想重试，您可能会希望关闭重试逻辑。您可以使用 `ClientConfiguration` 类，并且为 `maxErrorRetry` 提供 `0` 值，从而设置为不重试。

如果您没有使用 AWS SDK，则应当对收到服务器错误 (5xx) 的原始请求执行重试。但是，客户端错误（4xx，不是 `ThrottlingException` 或 `ProvisionedThroughputExceededException`）表示您需要对请求本身进行修改，先修正了错误然后再重试。

**注意**  
如果您通过轮询来确定请求的状态，并且 Elastic Transcoder 正在返回 HTTP 状态代码 429，错误代码为 `Provisioned Throughput Exceeded Exception` 或 `Throttling Exception`，请考虑使用通知而不是轮询来确定状态。有关更多信息，请参阅 [任务状态通知](notifications.md)。

除了简单重试之外，我们还建议使用指数回退算法来实现更好的流程控制。指数回退的原理是对于连续错误响应，重试等待间隔越来越长。例如，您可能会允许经过 1 秒后进行第一次重试，经过 4 秒后进行第二次重试，经过 16 秒后进行第三次重试，以此类推。但是，如果一分钟后请求未成功，则问题可能在于硬限制而不是请求速率。例如，您可能已达到允许的最大管道数量。您可以设置最大重试次数，在大约一分钟的时候停止重试。

以下是显示重试逻辑的一个工作流程。该工作流程逻辑首先确定遇到的是不是服务器错误 (5xx)。如果遇到的是服务器错误，代码就会重试原始请求。

```
currentRetry = 0
DO
  set retry to false

  execute Elastic Transcoder request

  IF Exception.errorCode = ProvisionedThroughputExceededException
    set retry to true
  ELSE IF Exception.httpStatusCode = 500
    set retry to true
  ELSE IF Exception.httpStatusCode = 400
    set retry to false 
    fix client error (4xx)

  IF retry = true  
    wait for (2^currentRetry * 50) milliseconds
    currentRetry = currentRetry + 1

WHILE (retry = true AND currentRetry < MaxNumberOfRetries)  // limit retries
```