Promise 的错误处理

阅读时长 7 分钟读完

Promise 是 JavaScript 中一种处理异步操作的方法。在前端开发中,Promise 很常用,但是在使用 Promise 的过程中,错误处理是一个非常重要的问题。本文将详细介绍 Promise 的错误处理,包括错误类型、错误处理方式以及常见错误处理场景。

Promise 的错误类型

在 Promise 中,错误可以分为两种类型:已处理错误未处理错误

已处理错误是指在 Promise 的 then 方法中使用 catch 方法处理的错误。例如:

-- -------------------- ---- -------
-------------------------------------
  -------------- -- -
    -- ------------- -
      ------ ----------------
    - ---- -
      ----- --- -------------- -------- --- --- ------
    -
  --
  ---------- -- -
    -- -- ----
  --
  ------------ -- -
    -- ----
  ---
展开代码

以上代码中,如果 fetch 请求返回的 response 不 ok,会抛出一个错误,然后进入 catch 方法中处理。

未处理错误是指在 Promise 的 then 方法中没有使用 catch 方法处理的错误。例如:

-- -------------------- ---- -------
-------------------------------------
  -------------- -- -
    -- ------------- -
      ------ ----------------
    - ---- -
      ----- --- -------------- -------- --- --- ------
    -
  --
  ---------- -- -
    -- -- ----
  ---
展开代码

以上代码中,如果 fetch 请求返回的 response 不 ok,会抛出一个错误,但是没有在 then 方法中处理。这种错误会被传递给 Promise 链中的下一个 then 方法,如果下一个 then 方法也没有处理,错误会一直传递下去,直到被处理为止。

Promise 的错误处理方式

在 Promise 中,错误处理有两种方式:全局错误处理局部错误处理

全局错误处理

全局错误处理是指在整个应用程序中使用 window.onerror 方法处理未处理错误。例如:

以上代码中,当应用程序中出现未处理错误时,会触发 window.onerror 方法,然后进入错误处理函数中。

全局错误处理有几个缺点:

  • 无法知道错误发生的具体位置。
  • 无法知道错误发生的具体原因。
  • 无法对错误进行分类处理。

因此,全局错误处理只能作为一种备用方案,用于处理一些无法预料的错误。

局部错误处理

局部错误处理是指在 Promise 的 then 方法中使用 catch 方法处理已处理和未处理错误。例如:

-- -------------------- ---- -------
-------------------------------------
  -------------- -- -
    -- ------------- -
      ------ ----------------
    - ---- -
      ----- --- -------------- -------- --- --- ------
    -
  --
  ---------- -- -
    -- -- ----
  --
  ------------ -- -
    -- ----
  ---
展开代码

以上代码中,使用 catch 方法处理了已处理和未处理错误。如果在 Promise 链中出现错误,会直接进入 catch 方法中处理。

局部错误处理有几个优点:

  • 可以知道错误发生的具体位置。
  • 可以知道错误发生的具体原因。
  • 可以对错误进行分类处理。

因此,局部错误处理是 Promise 中常用的错误处理方式。

Promise 的常见错误处理场景

在 Promise 中,常见的错误处理场景包括:

网络请求错误

在网络请求中,常见的错误有网络连接失败、服务器返回错误等。例如:

-- -------------------- ---- -------
-------------------------------------
  -------------- -- -
    -- ------------- -
      ------ ----------------
    - ---- -
      ----- --- -------------- -------- --- --- ------
    -
  --
  ---------- -- -
    -- -- ----
  --
  ------------ -- -
    ------------------------ -------
  ---
展开代码

以上代码中,如果网络请求失败或服务器返回错误,会进入 catch 方法中处理。

数据处理错误

在数据处理中,常见的错误有数据格式不正确、数据解析失败等。例如:

-- -------------------- ---- -------
-------------------------------------
  -------------- -- -
    -- ------------- -
      ------ ----------------
    - ---- -
      ----- --- -------------- -------- --- --- ------
    -
  --
  ---------- -- -
    -- ----- -- ----------- - -- -
      ------ ------------- -- -
        ------ -
          --- --------
          ----- ----------
          ---- --------
        --
      ---
    - ---- -
      ----- --- ----------- ------ -- -------------
    -
  --
  ---------- -- -
    -- -- ----
  --
  ------------ -- -
    ------------------------ -------
  ---
展开代码

以上代码中,如果数据格式不正确或数据解析失败,会进入 catch 方法中处理。

其他错误

除了网络请求错误和数据处理错误,还有一些其他错误,例如未知错误、权限错误等。例如:

-- -------------------- ---- -------
-------------------------------------
  -------------- -- -
    -- ------------- -
      ------ ----------------
    - ---- -
      ----- --- -------------- -------- --- --- ------
    -
  --
  ---------- -- -
    -- ----- -- ----------- - -- -
      ------ ------------- -- -
        -- --------- - --- -
          ----- --- ----------------- ----------
        -
        ------ -
          --- --------
          ----- ----------
          ---- --------
        --
      ---
    - ---- -
      ----- --- ----------- ------ -- -------------
    -
  --
  ---------- -- -
    -- -- ----
  --
  ------------ -- -
    ---------------------- -------
  ---
展开代码

以上代码中,如果数据中包含未成年人信息,会抛出一个权限错误,然后进入 catch 方法中处理。

结语

在使用 Promise 的过程中,错误处理是一个非常重要的问题。本文详细介绍了 Promise 的错误处理,包括错误类型、错误处理方式以及常见错误处理场景。希望本文能够对你的学习和工作有所帮助。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/678648b84083a4caeeeea545

纠错
反馈

纠错反馈

程序员教程

精选优质教程,助你快速提升技术实力

程序员面试题库

海量优质面试题,助你轻松应对技术面试