/ / es6 promet des erreurs de type à avaler - javascript, es6-promise

es6 promet des erreurs de type hirondelle - javascript, es6-promise

Je souhaite que le navigateur affiche un message d'erreur lorsqu'une erreur de type se produit.
des erreurs comme ne peut pas lire la propriété quelque chose d'indéfini ou référence indéfinie.

new Promise(function(resolve,reject){
// do stuff ...
reject("something logical is wrong");
}).catch(e => console.error(e));

new Promise(function(resolve,reject){
// do stuff, and a syntax error :/
var a = { };
a.something.otherthing = 1; /* we have an error here */
// ...
}).catch(e => console.error(e));

Dans le premier exemple, l'erreur est logique et son amende capture dans le capture(..) bloc.
Mais dans le deuxième exemple, il est clairerreur de développement, qui se produit tout le temps lors du développement de nouvelles choses. Je ne veux pas l'attraper, je veux que le navigateur me montre l'erreur comme les autres erreurs dans la console. Je veux pouvoir allumer pause chrome sur les exceptions et voir l'état des autres variables. Je veux voir la trace de la pile dans la console.
Je veux qu'il agisse comme un Ordinaire Erreur.

Une idée?

Réponses:

5 pour la réponse № 1

Contrairement aux exceptions dans le code synchrone, qui deviennent non attrapé dès que le code revient à tourner au ralenti, un navigateur ne connaît généralement pas la fin logique d'une chaîne de promesses. erreur asynchrone pourrait être considéré comme non capturé. Les chaînes sont assemblées dynamiquement après tout, et donc il vaut mieux se terminer par une finale .catch à l'extrémité logique de la chaîne, c'est-à-dire l'équivalent asynchrone de ralenti.

Avoir une finale .catch(e => console.error(e)) me semble très raisonnable, mais vous avez raison de dire que les navigateurs ont tendance à afficher ces erreurs différemment des exceptions non interceptées. Si vous souhaitez qu'elles apparaissent de la même façon, vous pouvez utiliser cette astuce:

.catch(e => setTimeout(() => { throw e; }))

Cela va jeter e, contenant la trace de pile d'origine et le numéro de ligne, au tout prochain cycle, et en dehors de la chaîne de promesse, où rien ne l'attrapera et il sera signalé comme non capturé. Nous utilisons setTimeout pour surmonter le comportement par défaut de .catch qui consiste à capturer toutes les exceptions en chaîne au cas où vous auriez l'intention de continuer à enchaîner.

Avec cela, j'espère que vous voyez que toute différenciation entre les erreurs «logiques» et autres n'est pas pertinente. Toute erreur qui se rend à la queue de la chaîne a été fatale à la chaîne, c'est-à-dire non attrapé (bien sûr, vous pouvez trier "logiquement" d'autres erreurs dans la capture finale et les afficher différemment si vous le souhaitez.)


2 pour la réponse № 2

chrome a une option Pause sur les exceptions capturées dans Sources onglet, j'ai activé cette option et Pause sur les exceptions fonctionnalité fonctionne bien maintenant.