getsentry / getsentry/sentry-javascript
Handle `SuppressedError`
- Linguagem predominante
- TypeScript
- Estrelas
- 8.7k
- Forks
- 1.8k
- Merge médio
- 1d 18h
- PRs com merge (30d)
- 541
Descrição
### 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!
}
```
Guia de contribuição
Direção de pesquisa
Comece lendo a proposta TC39 Explicit Resource Management e o exemplo de TypeScript 5.2 vinculado na issue. Defina como os valores aninhados `error` e `suppressed` devem ser extraídos para os relatórios e adicione cobertura mostrando que ambos os erros subjacentes são reportados, em vez de apenas o wrapper `SuppressedError`.
Escrita pelo modelo de indexação a partir do texto da issue.
Avaliação
- Stack de tecnologia
- javascript, typescript
- Domínio
- observability
- Tipo de issue
- Funcionalidade
- Dificuldade
- 4/5
- Tempo estimado
- 3-5 dias
- Status de atividade
- Estagnada
- Clareza
- Razoavelmente clara
- Facilidade para iniciantes
- 35/100