getsentry / getsentry/sentry-javascript

Handle `SuppressedError`

Đang mở
#8,441 1 bình luận 1 reaction 0 người được giao Xem trên GitHub
Core Improvement
Ngôn ngữ chính
TypeScript
Star
8.7k
Fork
1.8k
Merge trung bình
1 ngày 17 giờ
Pull request đã merge (30 ngày)
515

Mô tả

### Problem Statement

Explicit Resource Management has reached TC39 stage 3:
https://github.com/tc39/proposal-explicit-resource-management

Support has been added to TypeScript 5.2 beta:
https://devblogs.microsoft.com/typescript/announcing-typescript-5-2-beta/#using-declarations-and-explicit-resource-management

When this makes it into browsers/node.js/platforms, there will be a new error type called [`SuppressedError`](https://github.com/tc39/proposal-explicit-resource-management#the-suppressederror-error) which wraps any exception thrown and also any exception thrown during resource disposal.

Reporting `SuppressedError` directly to Sentry will likely be not that useful so the error(s) should be pulled out.

```ts
class SuppressedError extends Error {
/**
* Wraps an error that suppresses another error, and the error that was suppressed.
* @param {*} error The error that resulted in a suppression.
* @param {*} suppressed The error that was suppressed.
* @param {string} message The message for the error.
* @param {{ cause?: * }} [options] Options for the error.
*/
constructor(error, suppressed, message, options);

/**
* The name of the error (i.e., `"SuppressedError"`).
* @type {string}
*/
name = "SuppressedError";

/**
* The error that resulted in a suppression.
* @type {*}
*/
error;

/**
* The error that was suppressed.
* @type {*}
*/
suppressed;

/**
* The message for the error.
* @type {*}
*/
message;
}
```

The TypeScript introduction gives a good example of how these properties are populated:
```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!
}
```

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Đánh giá

Issue này chưa được đánh giá.

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.