在 ES9 中,try
/catch
/finally
语句的行为有了一些改变。其中最重要的变化是,现在可以在 catch
子句中绑定错误对象,而不仅仅是在 finally
子句中。
catch 绑定
在 ES8 及之前的版本中,catch
子句只能将错误对象绑定到一个变量上,例如:
try { // some code } catch (e) { console.error(e); }
在这个例子中,e
是一个变量,它被绑定到 catch
子句中捕获的错误对象上。这个错误对象可以是任何类型,包括 Error
、TypeError
、ReferenceError
等等。
在 ES9 中,catch
子句可以绑定到一个对象的属性上,例如:
try { // some code } catch ({ message }) { console.error(message); }
在这个例子中,我们使用了对象解构来将 catch
子句中捕获的错误对象的 message
属性绑定到一个变量 message
上。这个变量只包含错误信息字符串,而不是整个错误对象。
这个功能的好处是,我们可以更方便地访问错误对象的属性,而不需要在每个 catch
子句中都写一遍错误对象的名称。这也使得代码更加简洁和易于维护。
finally 调用顺序
在 ES9 中,finally
子句的行为也有所改变。现在,finally
子句将在 catch
子句之后调用,而不是之前。
这意味着,如果 catch
子句中有任何异步操作,它们将在 finally
子句之前完成。这种行为可能导致一些意外的结果,因此需要格外小心。
例如,考虑以下代码:
-- -------------------- ---- ------- --- - ----- --- --------------- - ----- --- - ------------- -- - ------------------------- -- ------ - ------- - --------------------- -
在这个例子中,我们在 catch
子句中使用了一个 setTimeout
函数来模拟一个异步操作。该操作会在 1 秒钟后输出错误信息字符串。
在 ES8 及之前的版本中,finally
子句将在 catch
子句之前调用,因此我们可以放心地假设错误信息已经被输出了。但是,在 ES9 中,finally
子句将在 catch
子句之后调用,因此它将在错误信息之前输出 'Done.'
。
为了解决这个问题,我们可以将异步操作移动到 finally
子句中,例如:
-- -------------------- ---- ------- --- - ----- --- --------------- - ----- --- - -- -- ------- - ------- - ------------- -- - --------------------- -- ------ -
在这个例子中,我们将异步操作移动到 finally
子句中,并确保它在错误信息之后输出。这样就可以避免任何意外的结果。
总结
ES9 中的 catch
绑定和 finally
调用顺序的改变使得错误处理更加简洁和易于维护。但是,我们需要小心 finally
子句的行为,以避免意外的结果。
在编写代码时,请确保仔细阅读文档,并始终测试您的代码,以确保它按预期工作。下面是一个完整的示例代码,供参考:
-- -------------------- ---- ------- --- - ----- --- --------------- - ----- -- ------- -- - ------------- -- - ----------------------- -- ------ - ------- - ------------- -- - --------------------- -- ------ -
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6556b3d0d2f5e1655d116475