Promise 中的优雅报错处理方式探究

阅读时长 5 分钟读完

Node.js 与浏览器都支持 Promise,被广泛应用于异步编程。 Promise 提供了更简洁的语法及更好的控制流程,使得回调地狱得到了缓解。但是,对于 Promise 执行中的异常情况处理,如何进行优雅的报错处理也是一个重要的问题。

Promise 异常处理

Promise 自带的异常处理使用 catch 就可以捕获异常,比如:

上面的代码会输出 'Oops! Error!'。 catch 函数就能够处理 Promise 中产生的异常。

catch 函数就像是 try-catch 块里的 catch 一样,能够处理从 Promise 中抛出的异常。但也存在如何处理 Promise 中的多个异常情况、如何优雅地处理异常等问题。

Promise 链式异常处理

由于 Promise 可以链式调用,因此 catch 函数也可以链式调用。一种常见的处理 Promise 链式异常的方式如下:

-- -------------------- ---- -------
------------
    -----------------
    -----------------
    ------------ -- -
        ----------------- ------- -------
    --
    ------------ -- -
        ----------------- --------- ------
    --

上述代码中,如果前面的 Promise 函数出错了,那么就可以在 catch 函数中处理错误。

但是当处理一些逻辑比较复杂的错误时,链式处理可能不够方便。

那么如何才能优雅地处理异常?

方式一:使用普通的函数

使用普通函数来简化错误处理的思路也是常见的方法。定义一个 errorHandler 函数,将 catch 中的处理逻辑放进去。如果实现得当,这样的方式可以使你的代码更干净、更可维护。

-- -------------------- ---- -------
----- -------- ----------------------- -
    --- -
        ----- ------ - ----- ------------
        ----- ------------------
        ----- ------------------
        ----------------- -------
    - ----- ------- -
        -------------------
    -
-

-------- ------------------- -
    ------------------- --------- ------
-

方式二:使用 async/await

async/await 的另一种好处是能够看到 await函数的返回值,这使得我们可以非常清晰地处理异常。我们可以在每个 async 函数里面进行错误处理并返回一个错误对象。如果有任何一个异步函数出现了错误,整个代码都会进入到 catch 中。

-- -------------------- ---- -------
----- -------- ----------------------- -
    --- -
        ----- ------- - ----- ------------
        ----- ------- - ----- -------------------
        ----- ------- - ----- -------------------
        ----------------- -------
    - ----- ------- -
        ------------------- --------- ------
    -
-

方式三:使用 Promise.all

使用 Promise.all 可以让多个异步请求并行执行的方式更简洁。如果任何一个异步请求失败了,整个异步请求都会进入到 catch 块。

总结

Promise 可以通过 catch 处理单个异常情况,但是处理更多异常情况时也需要更优雅的处理方式,例如使用普通函数、async/await、Promise.all 等方式。在代码写作时,需要结合项目实际情况、错误类型、异常处理方式来选择合适的处理方案,让代码更易维护和可读性更高。

示例代码

-- -------------------- ---- -------
----- -------- ----------------------- -
    --- -
        ----- --------- -------- -------- - ----- -------------------------- ------------- --------------
        ----------------- -------
    - ----- ------- -
        ------------------- --------- ------
    -
-

-------- ------------------- -
    ------------------- --------- ------
-

----- -------- ------------ -
    ----- --- ------------ ---- -------------
-

----- -------- ------------ -
    ------ ------------------ ------------ ---- --------------
-

----- -------- ------------ -
    ------ ----------------------- ---- -------------
-

-----------------------

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

纠错
反馈