何时引发异常会破坏 for 循环
本文关键字:for 循环 异常 何时引 | 更新日期: 2023-09-27 17:56:20
如果在我们完成循环之前抛出异常,DoSomething
中的 for 循环会中断吗?
var test = new Test(...)
try{
//do something in test
test.DoSomething()
}
catch(myException e)
{
''do something about this exception
}
class Test
{
public void DoSomething(...)
{
for(var i=0;i < 5; i++)
{
...
if(some smoke)
{
throw new myException {...}
}
...
}
}
你可以通过定义一个循环来测试你的问题,看看你是否可以在异常后达到一个点:
void Main()
{
try{
DoSomething();
}
catch{
Console.WriteLine("Yup. Breaks");
}
}
void DoSomething()
{
for(int i = 0; i <= 1; i++)
{
if(i == 0) {
throw new NotImplementedException();
}
if( i != 0)
{
Console.WriteLine("Loop continues");
}
}
}
并回答您的问题:不,代码中断,因为异常本身未处理。
如果在循环中放置了一个 try/catch 块,则可以在正确处理异常后在 catch-block 中调用 continue;
以继续迭代。
的中断
public void DoSth()
{
try
{
for(int i = 0; i ... ; i++)
{
if(...)
{
throw new Exception();
}
}
}
catch
{
}
}
不会中断
public void DoSth()
{
for(int i = 0; i ... ; i++)
{
try
{
if(...)
{
throw new Exception();
}
}
catch
{
}
}
}
因为当你有一个例外时,你会跳到catch块中。 当 catch 块位于 for 中时,它不会破坏 for。因为在 i 的下一次迭代中,您仍然在 for 中。
是的。
来自 如何:处理平行循环中的异常
Parallel.For 和 Parallel.ForEach 重载没有任何特殊机制来处理可能引发的异常。 在这方面,它们类似于常规的 for 和 foreach 循环(Visual Basic 中的 For 和 For each);未经处理的异常会导致循环立即终止。
通过抛出一个新myException(...)
你的循环中有一个未处理的异常,所以你的循环将中断,你的异常被抛到它上面的捕获