2015-10-27 2 views
7

Ich möchte der Browser eine Fehlermeldung anzeigen, wenn ein Fehler auftritt.
Fehler wie kann nicht lesen etwas von undefined oder undefined Referenz.es6 verspricht Schwalbe Fehler

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)); 

Im ersten Beispiel ist der Fehler eine logische Eins, und deren fein Fang es im catch (..) Block.
Aber im zweiten Beispiel ist es ein klarer Entwicklungsfehler, der die ganze Zeit während der Entwicklung neuer Sachen passiert. Ich will es nicht verstehen, ich möchte, dass der Browser den Fehler wie andere Fehler in der Konsole anzeigt. Ich möchte in der Lage sein, Chrom Pause auf Ausnahmen zu aktivieren und den Status anderer Variablen zu sehen. Ich möchte den Stack-Trace in der Konsole sehen.
Ich möchte es wie ein normal Fehler handeln.

Irgendeine Idee?

+0

Verwenden Ihr zweites Beispiel, ich bekomme den folgenden Fehler in meiner Konsole 'TypeError: Kann die Eigenschaft 'otherthing' von 'undefined' nicht setzen. Ist das nicht das, was du willst? Das Versprechen bleibt ausstehend, aber das ist ein anderes Problem. – AdamJeffers

+0

Ich möchte die Zeilennummer des Fehlers, Stack-Trace. –

+0

@AdamJeffers möchte ich * chrome * Break on Exceptions Feature auch verwenden. –

Antwort

5

Anders als Ausnahmen in synchronem Code, dieabgefangene werden, sobald Code wieder in Leerlauf, ein Browser im Allgemeinen nicht das logische Ende einer Versprechens-Kette nicht kennt, der ist, wo ein asynchroner Fehler konnte als nicht aufgefasst gelten. Ketten werden schließlich dynamisch zusammengefügt, und daher werden sie am logischen Ende der Kette, d. H. Dem asynchronen Äquivalent des Leerlaufs, mit einem abschließenden .catch beendet.

Eine endgültige .catch(e => console.error(e)) scheint mir sehr vernünftig, aber Sie haben Recht, dass Browser neigen dazu, diese Fehler anders als nicht abgefangene Ausnahmen anzuzeigen. Wenn Sie wollen, das Gleiche erscheinen, können Sie diesen Trick verwenden:

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

Diese e werfen, die Original-Stack-Trace und die Zeilennummer enthält, auf dem nächsten Zyklus, und außerhalb der Verheißung Kette, wo nichts wird es fangen und es wird als ungefangen gemeldet. Wir verwenden setTimeout, um das Standardverhalten von .catch zu überwinden, das irgendwelche Ausnahmen in der Kette erfassen soll, falls Sie beabsichtigen, weiter zu verketten.

Ich hoffe, Sie sehen, dass jede Unterscheidung zwischen "logischen" und anderen Fehlern irrelevant ist. Jeder Fehler, der es zum Ende der Kette macht, war fatal für die Kette dh uncaught (obwohl natürlich Sie "logisch" von anderen Fehlern in der endgültigen fangen und sie anders anzeigen können, wenn Sie wählen.)

2

Chrom hat eine Option Pause auf Gefangen Ausnahmen in Quellen Registerkarte aktiviert i die entsprechende Option und Pause auf Ausnahmen Funktion arbeitet jetzt in Ordnung.

+1

Dies wird sowohl beim logischen Fehler als auch beim 'TypeError' pausieren, also scheint dies nicht zu den Kriterien Ihrer eigenen Frage zu passen. – jib