660 Stimmen

Wie kann ich einen JavaScript-Stack-Trace erhalten, wenn ich eine Ausnahme auslöse?

Wenn ich selbst eine JavaScript-Ausnahme auslöse (z. B., throw "AArrggg" ), wie kann ich den Stack-Trace (in Firebug oder anders) erhalten? Im Moment bekomme ich nur die Meldung.

bearbeiten : Wie viele der unten genannten Personen gepostet haben, ist es möglich, einen Stack-Trace für eine JavaScript-Ausnahme aber ich möchte einen Stack-Trace für meine Ausnahmen. Zum Beispiel:

function foo() {
    bar(2);
}
function bar(n) {
    if (n < 2)
        throw "Oh no! 'n' is too small!"
    bar(n-1);
}

Wenn foo aufgerufen wird, möchte ich eine Stapelverfolgung erhalten, die die Aufrufe an foo , bar , bar .

2voto

Denis Orlov Punkte 84
function stacktrace(){
  return (new Error()).stack.split('\n').reverse().slice(0,-2).reverse().join('\n');
}

2voto

Amir Buzo Punkte 69
<script type="text/javascript"
src="https://rawgithub.com/stacktracejs/stacktrace.js/master/stacktrace.js"></script>
<script type="text/javascript">
    try {
        // error producing code
    } catch(e) {
        var trace = printStackTrace({e: e});
        alert('Error!\n' + 'Message: ' + e.message + '\nStack trace:\n' + trace.join('\n'));
        // do something else with error
    }
</script>

dieses Skript zeigt den Fehler an

1voto

Doua Beri Punkte 9908

Sie können diese Bibliothek verwenden http://www.stacktracejs.com/ . Es ist sehr gut

Aus der Dokumentation

Sie können auch einen eigenen Fehler eingeben, um einen Stacktrace zu erhalten, der nicht verfügbar ist in IE oder Safari 5-

<script type="text/javascript" src="https://rawgithub.com/stacktracejs/stacktrace.js/master/stacktrace.js"></script>
<script type="text/javascript">
    try {
        // error producing code
    } catch(e) {
        var trace = printStackTrace({e: e});
        alert('Error!\n' + 'Message: ' + e.message + '\nStack trace:\n' + trace.join('\n'));
        // do something else with error
    }
</script>

1voto

Jack G Punkte 3797

Hier ist eine Antwort, die Ihnen maximale Leistung (IE 6+) und maximale Kompatibilität bietet. Kompatibel mit IE 6!

    function stacktrace( log_result ) {
        var trace_result;
    // IE 6 through 9 compatibility
    // this is NOT an all-around solution because
    // the callee property of arguments is depredicated
    /*@cc_on
        // theese fancy conditinals make this code only run in IE
        trace_result = (function st2(fTmp) {
            // credit to Eugene for this part of the code
            return !fTmp ? [] :
                st2(fTmp.caller).concat([fTmp.toString().split('(')[0].substring(9) + '(' + fTmp.arguments.join(',') + ')']);
        })(arguments.callee.caller);
        if (log_result) // the ancient way to log to the console
            Debug.write( trace_result );
        return trace_result;
    @*/
        console = console || Console;   // just in case
        if (!(console && console.trace) || !log_result){
            // for better performance in IE 10
            var STerror=new Error();
            var unformated=(STerror.stack || STerror.stacktrace);
            trace_result = "\u25BC console.trace" + unformated.substring(unformated.indexOf('\n',unformated.indexOf('\n'))); 
        } else {
            // IE 11+ and everyone else compatibility
            trace_result = console.trace();
        }
        if (log_result)
            console.log( trace_result );

        return trace_result;
    }
// test code
(function testfunc(){
    document.write( "<pre>" + stacktrace( false ) + "</pre>" );
})();

1voto

Anthony Zhan Punkte 813

Versuchen Sie es einfach

throw new Error('some error here')

Das funktioniert ziemlich gut für Chrom:

enter image description here

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X