2013-04-16 13 views
9

Questo codice:Come posso rilanciare un'eccezione e conservare la traccia dello stack?

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

stampe:

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

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

Così la traccia dello stack originale è completamente perso. C'è un modo per rethrow con la traccia dello stack preservata?

+0

cosa succede se semplicemente 'rethrow'? – Ladicek

+0

@Ladicek, c'è una parola chiave 'rethrow' in Dart? Non riesco a trovare prove online e l'installazione di Dart non la capisce. –

+0

@DarshanComputing Vedi capitolo 12.8.1 della specifica. – Ladicek

risposta

9

versioni attuali del Dart VM e dart2js supporto rethrowing, preservando l'analisi dello stack, con rethrow:

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

Questo produce:

 
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

Fantastico, grazie Darshan! –

+0

Quindi - la differenza è che tu "getti" e @JustinFagnani sta facendo "buttare e'"? – Jasper

+0

@Jasper Sì, 'throw e;' è un lancio normale, mentre 'throw;' è il modo corrente di scrivere 'rethrow;'. –

Problemi correlati