.net 在try,catch块中使用for循环?

.net 在try,catch块中使用for循环?,.net,powershell,.net,Powershell,我正在尝试了解Powershell中的异常处理,更具体地说,如何在操作失败时使用for循环重试操作 我有下面的代码,它捕获异常,但只尝试for循环的一次迭代 我在for循环中是否做错了什么?或者这是catch块不处理循环的行为吗 try{ Copy-Item "C:\Path\To\Source.file" "C:\Path\To\Destination.file" -Force -ErrorAction Stop } catch{ $e = $_

我正在尝试了解Powershell中的异常处理,更具体地说,如何在操作失败时使用for循环重试操作

我有下面的代码,它捕获异常,但只尝试for循环的一次迭代

我在for循环中是否做错了什么?或者这是catch块不处理循环的行为吗

try{
        Copy-Item "C:\Path\To\Source.file" "C:\Path\To\Destination.file" -Force -ErrorAction Stop
    }
    catch{
        $e = $_.Exception.GetType().Name
        LogWrite $e
        if($e -eq 'IOException')
        {
            for($i=0; $i -lt 6; $i++)
            {
                LogWrite "Waiting..."
                Start-Sleep -s 10
                LogWrite "Copying in the file attempt $i" 
                Copy-Item "C:\Path\To\Source.file" "C:\Path\To\Destination.file" -Force
            }
        }            
    }

您希望将
try
/
catch
放在循环构造中。这里有一种方法可以做到这一点:

$i = 0
$done = $False
while(-not ($done) -and ($i -lt 6))
{
    try{
        Copy-Item "C:\Path\To\Source.file" "C:\Path\To\Destination.file" -Force -ErrorAction Stop
        $done = $True
    }
    catch{
        $e = $_.Exception.GetType().Name
        LogWrite $e
        if($e -eq 'IOException')
        {
            LogWrite "Waiting..."
            Start-Sleep -s 10
            LogWrite "Copying in the file attempt $i" 
            $i = $i + 1
        }
        else
        {
            $i = 6
        }
    }
}
在当前尝试中,第二个
复制项
不包含在
try
块中,
catch
块仅捕获在其相应
try
块中发生的异常


(如果
$i
达到6,则可能需要在循环后执行某些操作,例如报告遇到不可恢复的错误)

要将
try
/
catch
放在循环构造内部。这里有一种方法可以做到这一点:

$i = 0
$done = $False
while(-not ($done) -and ($i -lt 6))
{
    try{
        Copy-Item "C:\Path\To\Source.file" "C:\Path\To\Destination.file" -Force -ErrorAction Stop
        $done = $True
    }
    catch{
        $e = $_.Exception.GetType().Name
        LogWrite $e
        if($e -eq 'IOException')
        {
            LogWrite "Waiting..."
            Start-Sleep -s 10
            LogWrite "Copying in the file attempt $i" 
            $i = $i + 1
        }
        else
        {
            $i = 6
        }
    }
}
在当前尝试中,第二个
复制项
不包含在
try
块中,
catch
块仅捕获在其相应
try
块中发生的异常


(如果
$i
已达到6,则可能需要在循环后执行某些操作,例如报告遇到不可恢复的错误)

$e-eq'IOException'
为false。您所看到的“1迭代”是
LogWrite$e
。感谢您的回复,我想我理解您的意思,如果异常不是“IOException”,它在我的检查中返回false,因此不会在for循环中执行代码。我使用了下面答案中的代码,因为逻辑对于这个场景来说更有意义,但我仍然希望它在$e-eq'IOException'为真时执行for循环5次。也为帮助干杯<代码>$e-eq“IOException”获取false。您所看到的“1迭代”是
LogWrite$e
。感谢您的回复,我想我理解您的意思,如果异常不是“IOException”,它在我的检查中返回false,因此不会在for循环中执行代码。我使用了下面答案中的代码,因为逻辑对于这个场景来说更有意义,但我仍然希望它在$e-eq'IOException'为真时执行for循环5次。也为帮助干杯!干杯,伙计,这更有意义。还有+表示完成,因为我想知道如何在成功后退出或继续尝试。我将试一试这段代码,看看我是否可以扩展它。只是澄清一下,我的原始代码仍然应该迭代for循环的每个计数,但是如果它在尝试一时抛出异常,它将退出for循环并继续?很抱歉把事情弄糊涂了,我只是想知道为什么即使在我捕获了原始异常之后,它也不计算超过索引0的值。Powershell非常棒。干杯,伙计,这更有意义。还有+表示完成,因为我想知道如何在成功后退出或继续尝试。我将试一试这段代码,看看我是否可以扩展它。只是澄清一下,我的原始代码仍然应该迭代for循环的每个计数,但是如果它在尝试一时抛出异常,它将退出for循环并继续?很抱歉把事情弄糊涂了,我只是想知道为什么即使在我捕获了原始异常之后,它也不计算超过索引0的值。Powershell非常棒。