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

时间:2017-02-09 10:17:39

标签: .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 = $_.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
            }
        }            
    }

1 个答案:

答案 0 :(得分:2)

您希望将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
        }
    }
}

在您当前的尝试中,第二个Copy-Item 不包含在try块中,而catch块仅捕获在其中发生的异常他们对应的try

(如果$i已达到6,您可能希望在循环后执行某些操作,例如报告您遇到了无法恢复的错误)