Skip to content

Commit

Permalink
using 声明与显式资源管理
Browse files Browse the repository at this point in the history
  • Loading branch information
zhongsp committed Aug 31, 2023
1 parent ea50503 commit b98e020
Showing 1 changed file with 44 additions and 0 deletions.
44 changes: 44 additions & 0 deletions zh/release-notes/typescript-5.2.md
Original file line number Diff line number Diff line change
Expand Up @@ -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!
}
```

你可能已经注意到了,在这些例子中使用的都是同步方法。
然而,很多资源释放的场景涉及到*异步*操作,我们需要等待它们完成才能进行后续的操作。

0 comments on commit b98e020

Please sign in to comment.