2013-04-16 11 views
9

Dieser Code:Wie wiederhole ich eine Ausnahme und behalte den Stack-Trace?

try { 
    try { 
    throw 1; 
    } catch (e, s) { 
    print("$e $s"); 
    throw e; 
    } 
} catch (e2, s2) { 
    print("$e2 $s2");  
} 

druckt:

1 #0  main (file:///.../test.dart:34:7) 

1 #0  main (file:///.../test.dart:37:7) 

So der ursprüngliche Stack-Trace vollständig verloren. Gibt es eine Möglichkeit, mit der Stack-Trace beibehalten zu erhalten?

+0

Was passiert, wenn Sie nur 'rethrow'? – Ladicek

+0

@Ladicek, gibt es ein 'retrow'-Schlüsselwort in Dart? Ich kann online keine Beweise dafür finden, und meine Dart-Installation versteht es nicht. –

+0

@DarshanComputing Siehe Kapitel 12.8.1 der Spezifikation. – Ladicek

Antwort

9

Aktuelle Versionen der Dart VM und dart2js Unterstützung Erneutes Auslösen, die Stack-Trace zu bewahren, mit rethrow:

void main() { 
    try { 
    try { 
     throw 1; 
    } catch (e, s) { 
     print("$e $s"); 
     rethrow; 
    } 
    } catch (e2, s2) { 
    print("$e2 $s2");  
    } 
} 

Dies erzeugt:

 
1 #0  main (file:///home/darshan/so/stacktrace.dart:4:7) 

1 #0  main (file:///home/darshan/so/stacktrace.dart:4:7) 
#1  main (file:///home/darshan/so/stacktrace.dart:7:7) 
+0

Super, danke Darshan! –

+0

Also - der Unterschied ist, dass du einfach "wirfst" und @JustinFagnani tut 'throw e'? – Jasper

+0

@Jasper Ja, 'throw e;' ist ein normaler Wurf, während 'throw;' die aktuelle Schreibweise 'retrow;' ist. –

Verwandte Themen