From b98e0203d4360cb9116a84e862cd6f60f516b627 Mon Sep 17 00:00:00 2001 From: zhongsp Date: Thu, 31 Aug 2023 20:49:57 +0800 Subject: [PATCH] =?UTF-8?q?using=20=E5=A3=B0=E6=98=8E=E4=B8=8E=E6=98=BE?= =?UTF-8?q?=E5=BC=8F=E8=B5=84=E6=BA=90=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zh/release-notes/typescript-5.2.md | 44 ++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/zh/release-notes/typescript-5.2.md b/zh/release-notes/typescript-5.2.md index 8d968b14..8e06519e 100644 --- a/zh/release-notes/typescript-5.2.md +++ b/zh/release-notes/typescript-5.2.md @@ -188,3 +188,47 @@ func(); `using` 声明对异常具有适应性;如果抛出了一个错误,那么在资源释放后会重新抛出错误。 另一方面,一个函数体可能正常执行,但是 `Symbol.dispose` 可能抛出异常。 这种情况下,异常会被重新抛出。 + +但如果释放之前的逻辑以及释放时的逻辑都抛出了异常会发生什么? +为处理这类情况引入了一个新的类型 `SuppressedError`,它是 `Error` 类型的子类型。 +`SuppressedError` 类型的 `suppressed` 属性保存了上一个错误,同时 `error` 属性保存了最后抛出的错误。 + +```ts +class ErrorA extends Error { + name = "ErrorA"; +} +class ErrorB extends Error { + name = "ErrorB"; +} + +function throwy(id: string) { + return { + [Symbol.dispose]() { + throw new ErrorA(`Error from ${id}`); + } + }; +} + +function func() { + using a = throwy("a"); + throw new ErrorB("oops!") +} + +try { + func(); +} +catch (e: any) { + console.log(e.name); // SuppressedError + console.log(e.message); // An error was suppressed during disposal. + + console.log(e.error.name); // ErrorA + console.log(e.error.message); // Error from a + + console.log(e.suppressed.name); // ErrorB + console.log(e.suppressed.message); // oops! +} +``` + +你可能已经注意到了,在这些例子中使用的都是同步方法。 +然而,很多资源释放的场景涉及到*异步*操作,我们需要等待它们完成才能进行后续的操作。 +