2013-04-16 101 views
9

此代碼:如何重新拋出異常並保留堆棧跟蹤?

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

打印:

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

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

所以原來的堆棧跟蹤完全喪失。有沒有什麼方法可以保留堆棧跟蹤重新拋出?

+0

會發生什麼? – Ladicek

+0

@Ladicek,Dart中是否有'rethrow'關鍵字?我無法在網上找到它的證據,而我的Dart安裝不理解它。 –

+0

@DarshanComputing請參閱規範的第12.8.1章。 – Ladicek

回答

9

當前達特VM的版本和dart2js支持重新拋出,保留堆棧跟蹤,以rethrow

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

由此產生:如果你只是`rethrow`

 
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

真棒,謝謝Darshan! –

+0

所以 - 區別在於你只是'拋出'而@JustinFagnani正在'拋出e'? – Jasper

+0

@Jasper是的,'拋e;'是一個正常的投擲,而'throw;'是寫'rethrow;'的當前方式。 –

相關問題