Exception handling Dart try/catch子句意外行为

Exception handling Dart try/catch子句意外行为,exception-handling,try-catch,dart,Exception Handling,Try Catch,Dart,所以我正在试验一个try/catch子句,我不明白为什么会发生这种情况(正常或不正常): void main(){ List someList=[1,2,3]; 试一试{ for(变量x在someList中){ 试一试{ 对于(x中的变量z){ } }捕获(e){ 抛出新异常(“内部”); } } }捕获(e){ 抛出新异常(“外部”); } } 你看,我试图在一个循环中做一个循环,但是有目的地,someList不是一个List,因此嵌套的循环将抛出一个错误(“内部”错误),因为1是一个int

所以我正在试验一个
try
/
catch
子句,我不明白为什么会发生这种情况(正常或不正常):

void main(){
List someList=[1,2,3];
试一试{
for(变量x在someList中){
试一试{
对于(x中的变量z){
}
}捕获(e){
抛出新异常(“内部”);
}
}
}捕获(e){
抛出新异常(“外部”);
}
}
你看,我试图在一个循环中做一个循环,但是有目的地,
someList
不是一个
List
,因此嵌套的循环将抛出一个错误(“内部”错误),因为
1
是一个
int
,而不是
列表

这是一个场景,但发生的是它抛出了“外部”错误


这正常吗?如果是这样,我哪里出错了?

您得到的异常是因为
w
未定义。如果将
w
更改为
someList
,则会出现
x
没有迭代器的异常,如您所料。然后,您将处理该“内部”异常,并立即抛出另一个异常,您将捕获该异常,然后您将抛出“外部”异常,您不会处理该异常,并且将看到该异常的错误。(这可能会使您看起来像是遇到了“外部”错误,但错误是从“内部”开始的。)

这可能会让事情变得更清楚:

void main(){
List someList=[1,2,3];
试一试{
for(变量x在someList中){
试一试{
对于(x中的var z){//这会引发一个异常
}
}抓住(e){//你在这里抓住了哪一个
印刷品(e);
印刷品(“从内部投掷”);
抛出新异常('inside');//现在抛出另一个异常
}
}
}抓住(e){//你在这里抓住了哪一个
印刷品(e);
印刷品(“从外面扔”);
抛出新异常('outside');//现在抛出第三个异常
}
}//未捕获,导致
//“未处理的异常”消息

忘记将
w
更改为
someList
,但它仍然从outside@Ahoy——继续读。它不会从“外部”抛出,直到它捕获了您从“内部”抛出的异常。您只看到未处理的异常的消息,这是外部异常(由内部引起…)