2013-04-16 66 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;'的当前方式。 –