解决 ES12 中遇到的 Muted Errors 无法正确捕捉的问题

阅读时长 6 分钟读完

在使用ES12(亦称为ES2021)编写JavaScript代码的过程中,有时候会遇到 Muted Errors 无法被正确捕捉的问题。这是因为ES12 引入的一种新的语言特性—— Muted Errors,虽然它可以帮助我们在代码运行时忽略一些错误,但它也给开发带来了一些挑战。在本文中,我们将探讨这种情况,并介绍如何解决这个问题。

什么是 Muted Errors?

在ES12中,Muted Errors是 一种新的错误捕获机制。通过它,我们可以禁用某个特定语句或函数的异常抛出,通俗来说就是将错误消音。这种机制在处理一些不太重要的错误时可以提高应用程序的容错性,使得应用程序不会因为某个小错误而崩溃。

下面是一个简单的 Muted Errors 示例代码:

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

该函数尝试将根据某个给定JSON数据对象加载数据,并尝试解析其中的条目。如果遇到一个非字符串类型的值,则会抛出一个异常。但在上面的代码中,如果 try 块中的代码抛出一个异常,它将被忽略,因为我们使用了 Muted Errors 机制,并将其捕获在 catch 块中。

Muted Errors 为何会导致问题?

虽然 Muted Errors 可以帮助我们确保应用程序不会因为小错误而崩溃,但它们也会导致一些问题。在某些场景下,我们希望在代码中捕获某个异常,但由于使用了 Muted Errors ,这个异常却被忽略了,从而导致了问题的出现。

下面是一个 Muted Errors 的问题示例代码:

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

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

-------

在上面的代码中,我们定义了一个异步函数 fetchMovies ,用来请求某个电影的详细信息。在该函数中,我们使用了 Muted Errors 机制以忽略可能出现的异常。然后,我们定义了另一个异步函数 main ,该函数会同时调用 fetchMovies 函数,并在其返回一个错误时捕获异常。最后,我们在主程序中使用 main 函数并对异常进行了处理。

然而,如果fetchMovies函数中发生了错误,它将被 Muted Errors 忽略,因此该错误不会被正确捕获。这样一来,在 main 函数中,我们将无法正确处理 fetchMovies 函数中的错误,从而导致程序出错。

如何解决 Muted Errors 的问题?

要解决 Muted Errors 带来的问题,我们需要找到一种方法来避免 Muted Errors 在我们不希望它忽略异常的代码段中被使用。

下面是 Muted Errors 的解决方案示例代码:

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

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

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

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

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

-------

上述示例代码中,我们创建了一个名为 mutedErrors 的 WeakSet 。该 Set 用于跟踪哪些函数被屏蔽了。然后,我们定义了一个名为 muteError 的函数,该函数接受一个函数作为参数,并返回一个新函数,该函数在原函数的基础上添加了 Muted Errors 机制。该函数还会将原函数添加到 mutedErrors 中。

最后,我们使用 fetchMovies 函数创建了一个新函数 fetchMoviesMuted ,该函数使用了 Muted Errors 机制。我们可以安全地在 fetchMoviesMuted 函数中使用 Muted Errors ,因为该函数被定义为在 mutedErrors 中,这样我们就可以通过 search 方法找到使用了该函数的页面。我们也可以在 main 函数中使用由 fetchMoviesMuted 封装后的 fetchMovies 函数。

总结

Muted Errors 是一个有用的语言特性,可以帮助我们在代码运行时忽略一些不是很重要的错误。但如果不谨慎使用此功能,可能会导致程序不稳定以及产生其它的一些问题。通过使用上述代码,我们可以减少这种问题的出现,同时还能确保在 Muted Errors 不受影响的情况下捕获异常。

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

纠错
反馈