RTCDataChannel:error 事件

Baseline 已广泛支持

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2020 年 1 月⁩ 起,所有主流浏览器均已支持。

当数据通道发生错误时,会向 RTCDataChannel 对象的 onerror 事件处理程序发送一个 WebRTC error 事件。

RTCErrorEvent 对象提供了有关发生的错误的详细信息;有关详细信息,请参阅该文章。

此事件不可取消,也不会冒泡。

语法

在诸如 addEventListener() 之类的方法中使用事件名称,或设置事件处理程序属性。

js
addEventListener("error", (event) => { })

onerror = (event) => { }

事件类型

一个 RTCErrorEvent。继承自 Event

Event RTCErrorEvent

事件属性

除了下面列出的属性之外,父接口 Event 的属性也可使用。

error 只读

一个 RTCError 对象,指定发生的错误;此对象包含错误的类型以及错误发生位置的信息(例如,SDP 中的行号或涉及的 SCTP 错误代码)。

示例

js
// Strings for each of the SCTP cause codes found in RFC
// 4960, section 3.3.10:
// https://datatracker.ietf.org/doc/html/rfc4960#section-3.3.10

const sctpCauseCodes = [
  "No SCTP error",
  "Invalid stream identifier",
  "Missing mandatory parameter",
  "Stale cookie error",
  "Sender is out of resource (i.e., memory)",
  "Unable to resolve address",
  "Unrecognized SCTP chunk type received",
  "Invalid mandatory parameter",
  "Unrecognized parameters",
  "No user data (SCTP DATA chunk has no data)",
  "Cookie received while shutting down",
  "Restart of an association with new addresses",
  "User-initiated abort",
  "Protocol violation",
];

dc.addEventListener("error", (ev) => {
  const err = ev.error;

  console.error("WebRTC error: ", err.message);

  // Handle specific error detail types

  switch (err.errorDetail) {
    case "sdp-syntax-error":
      console.error("    SDP syntax error in line ", err.sdpLineNumber);
      break;
    case "idp-load-failure":
      console.error(
        "    Identity provider load failure: HTTP error ",
        err.httpRequestStatusCode,
      );
      break;
    case "sctp-failure":
      if (err.sctpCauseCode < sctpCauseCodes.length) {
        console.error("    SCTP failure: ", err.sctpCauseCode);
      } else {
        console.error("    Unknown SCTP error");
      }
      break;
    case "dtls-failure":
      if (err.receivedAlert) {
        console.error("    Received DTLS failure alert: ", err.receivedAlert);
      }
      if (err.sentAlert) {
        console.error("    Sent DTLS failure alert: ", err.receivedAlert);
      }
      break;
  }

  // Add source file name and line information

  console.error(
    "    Error in file ",
    err.filename,
    " at line ",
    err.lineNumber,
    ", column ",
    err.columnNumber,
  );
});

收到的事件通过一个名为 errorRTCError 对象提供详细信息;RTCErrorDOMException 接口的扩展。错误的 nameRTCErrormessage 是 WebRTC 层指定的错误字符串。

错误信息使用 console.error() 输出到控制台。message 字符串以及有关错误发生源文件名、行号和列号的信息始终会输出。

此外,根据 errorDetail 的值,可能会输出额外的信息。每种错误类型都有不同的输出信息集。例如,SDP 语法错误会显示 SDP 中错误的行号,而 SCTP 错误会显示与 SCTP 错误代码对应的消息。其他错误类型也会类似地输出相应的信息。

您还可以使用 RTCDataChannel 接口的 onerror 事件处理程序属性来设置 error 事件的事件处理程序。

js
dc.onerror = (ev) => {
  const err = ev.error;

  // …
};

注意:由于 RTCError 不是旧版错误之一,因此 RTCError.code 的值始终为 0。

规范

规范
WebRTC:浏览器中的实时通信
# event-datachannel-error
WebRTC:浏览器中的实时通信
# dom-rtcdatachannel-onerror

浏览器兼容性

另见