nodejs / nodejs/node

util: `SuppressedError` should print `error`/`suppressed` properties during inspection

Ouverte
#66,033 0 commentaires 1 réaction 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

feature request
Langage dominant
JavaScript
Étoiles
122k
Forks
37.3k
Merge moyen
4 j 2 h
PR mergées (30 j)
283

Description

What is the problem this feature will solve?

When a SuppressedError is thrown (e.g. from disposal errors during a using/await using block) and inspected via util.inspect() / console.log(), then the actual underlying errors (error and suppressed properties) are not shown:

class Resource {
  [Symbol.dispose]() {
    throw new Error('error during dispose');
  }
}
function test() {
  using res = new Resource();
  throw new Error('error during execution');
}
test();

Current output (Node v26.8.2):

SuppressedError: An error was suppressed during disposal.
    at test (REPL10:3:3)

Both those errors are essential for debugging.

This has the exact same shape as two problems Node already solved for other "container" errors:

AggregateError.errors was silently swallowed during inspection — fixed in #43646 (tracked in #43645).
Error.cause was silently swallowed during inspection — fixed in #41002 (tracked in #40859).

SuppressedError.error / SuppressedError.suppressed fall into the same category and currently have no equivalent handling in formatError() (lib/internal/util/inspect.js).

What is the feature you are proposing to solve the problem?

Extend formatError() so that, similar to how cause and errors are already special-cased, the non-enumerable error and suppressed properties of a SuppressedError are always included in the inspected output (recursively, since a SuppressedError can itself wrap another SuppressedError when multiple disposals fail).

Desired output, roughly matching what the cause-chain rendering already does:

SuppressedError: An error was suppressed during disposal.
    at test (…)
    ... {
  [error]: Error: error during dispose
      at Resource.[Symbol.dispose] (…)
      ...,
  [suppressed]: Error: error during execution
      at test (…)
      ...
}
What alternatives have you considered?
  • Manually logging e.error and e.suppressed in application code — works, but requires every catch block to know it might be dealing with a SuppressedError.
  • A userland [util.inspect.custom] patch on SuppressedError.prototype — works.

I believe a better out-of-the-box experience is required, rather than user-land patches. Workarounds shouldn't be necessary for a built-in error type tied to a TC39-standardized language feature

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez dans lib/internal/util/inspect.js, au niveau de formatError(), en comparant la gestion spéciale existante de cause et errors. Étendez l’inspection afin que SuppressedError.error et SuppressedError.suppressed apparaissent récursivement, puis vérifiez que util.inspect() et console.log() produisent la sortie imbriquée demandée pour les erreurs de libération des ressources.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
javascript
Domaine
tooling
Type d'issue
Fonctionnalité
Difficulté
3/5
Temps estimé
1-2 jours
Activité
Active
Clarté
Clairement spécifiée
Accessibilité débutants
78/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.