

# IVS Web 广播 SDK 中的错误处理 \| 实时直播功能
<a name="broadcast-web-error-handling"></a>

本节概述错误条件、Web 广播 SDK 如何向应用程序报告错误条件，以及在遇到这些错误时应用程序应采取的措施。SDK 会向 `StageEvents.ERROR` 事件的侦听器报告错误：

```
stage.on(StageEvents.ERROR, (error: StageError) => {
    // log or handle errors here
    console.log(`${error.code}, ${error.category}, ${error.message}`);
});
```

## 暂存区错误
<a name="web-error-handling-stage-errors"></a>

当 SDK 遇到无法恢复的问题时会报告 StageError，通常需要应用程序干预和/或网络重新连接才能恢复。

每个报告的 `StageError` 都有一个代码（或 `StageErrorCode`）、消息（字符串）和类别（`StageErrorCategory`）。每个都与一个底层操作类别相关。

错误的操作类别根据其是否与暂存区的连接（`JOIN_ERROR`）、向暂存区发送媒体（`PUBLISH_ERROR`）或接收来自暂存区的传入媒体流（`SUBSCRIBE_ERROR`）有关来确定。

`StageError` 的代码属性报告特定问题：


| 名称 | 代码 | Recommended Action（建议的操作） | 
| --- | --- | --- | 
| TOKEN\_MALFORMED | 1 | 创建一个有效的令牌，然后重试实例化暂存区。 | 
| TOKEN\_EXPIRED | 2 | 创建一个未过期的令牌，然后重试实例化暂存区。 | 
| TIMEOUT | 3 | 操作已超时。如果暂存区存在且该令牌有效，则此失败很可能是网络问题。在这种情况下，等待设备连接恢复。 | 
| FAILED | 4 | 尝试操作时遇到致命情况。查看错误详细信息。<br />如果暂存区存在且该令牌有效，则此失败很可能是网络问题。在这种情况下，等待设备连接恢复。<br />对于大多数与网络稳定性相关的故障，SDK 将在发出 FAILED 错误之前在内部重试最多 30 秒。 | 
| CANCELED | 5 | 检查应用程序代码并确保没有重复的 `join`、`refreshStrategy` 或 `replaceStrategy` 调用，这些调用可能导致在完成之前开始和取消重复的操作。 | 
| STAGE\_AT\_CAPACITY | 6 | 此错误表明该暂存区或您的账户已满容量。如果该暂存区已达到参与者限制，则当该暂存区不再满容量时，请通过刷新策略再次尝试该操作。如果账户已达到其并发订阅量或并发发布者配额，请通过 [AWS 服务配额控制台](https://console.aws.amazon.com/servicequotas/)减少使用量或申请增加配额。 | 
| CODEC\_MISMATCH | 7 | 暂存区不支持该编解码器。检查浏览器和平台是否支持编解码器。对于 IVS 实时直播功能，浏览器必须支持视频的 H.264 编解码器和音频的 Opus 编解码器。 | 
| TOKEN\_NOT\_ALLOWED | 8 | 令牌没有执行该操作的权限。使用正确的权限重新创建令牌，然后重试。 | 
| STAGE\_DELETED | 9 | 无；尝试加入已删除的暂存区会触发此错误。 | 
| PARTICIPANT\_DISCONNECTED | 10 | 无；尝试使用已断开连接的参与者的令牌加入会触发此错误。 | 

### 处理 StageError 示例
<a name="web-error-handling-stage-errors-example"></a>

使用 StageError 代码确定错误是否由于令牌过期导致：

```
stage.on(StageEvents.ERROR, (error: StageError) => {
    if (error.code === StageError.TOKEN_EXPIRED) {
        // recreate the token and stage instance and re-join
    }
});
```

### 已加入时出现网络错误
<a name="web-error-handling-stage-errors-network"></a>

如果设备的网络连接中断，SDK 可能会失去与暂存区服务器的连接。您可能会在控制台中看到错误，因为 SDK 无法再访问后端服务。向 https://broadcast.stats.live-video.net 执行 POST 操作会失败。

如果您正在发布和/或订阅，您将在控制台中看到与尝试发布/订阅相关的错误。

在内部，SDK 将尝试使用指数回退策略重新连接。

**操作**：等待设备连接恢复。

## 出错的状态
<a name="web-error-handling-errored-states"></a>

建议您使用这些状态进行应用程序日志记录，并向用户显示消息，提醒他们注意特定参与者与暂存区的连接问题。

### 发布
<a name="errored-states-publish"></a>

当发布失败时，SDK 会报告 `ERRORED`。

```
stage.on(StageEvents.STAGE_PARTICIPANT_PUBLISH_STATE_CHANGED, (participantInfo, state) => {
  if (state === StageParticipantPublishState.ERRORED) {
      // Log and/or display message to user
  }
});
```

### Subscribe
<a name="errored-states-subscribe"></a>

SDK 会在订阅失败时报告 `ERRORED`。这可能是由于网络条件或订阅者的某个阶段已满负荷而发生的情况。

```
stage.on(StageEvents.STAGE_PARTICIPANT_SUBSCRIBE_STATE_CHANGED, (participantInfo, state) => {
  if (state === StageParticipantSubscribeState.ERRORED) {
    // Log and/or display message to user
  }
});
```