我是否需要try / catch和-ErrorAction?

时间:2014-12-16 19:50:08

标签: powershell error-handling try-catch

以下代码尝试使用两种具有不同错误管理技术的函数以三种不同的方式复制文件test

  1. 对自己(它应该失败,因为它是不可能的)
  2. 到一个隐藏文件(它应该失败,因为默认情况下不能覆盖隐藏文件)
  3. 到一个不存在的文件夹(它应该失败,因为该文件夹不存在)
  4. 这两个函数中的一个使用try/catch来管理错误,并且能够检测前两个错误,另一个使用-ErrorAction并且能够检测到第三个错误。

    是否有一种技术来捕获所有错误?

    或者我是否总是需要使用这两种技术?

    function TestTryCatch($N, $Source, $Dest) {
        Write-Output "$N TestTryCatch $Source $Dest"
        try {Copy-Item $Source $Dest}
        catch {Write-Output "Error: $($error[0].exception.message)"}
    }
    
    function TestErrorAction($N, $Source, $Dest) {
        Write-Output "$N TestErrorAction $Source $Dest"
        Copy-Item $Source $Dest -ErrorAction SilentlyContinue
        if(!$?) {Write-Output "Error: $($error[0].exception.message)"}
    }
    
    New-Item 'test' -ItemType File | Out-Null
    (New-Item 'hidden' -ItemType File).Attributes = 'Hidden'
    
    TestTryCatch 1 'test' 'test'
    TestTryCatch 2 'test' 'hidden'
    TestTryCatch 3 'test' 'nonexistingfolder\test'
    
    TestErrorAction 1 'test' 'test'
    TestErrorAction 2 'test' 'hidden'
    TestErrorAction 3 'test' 'nonexistingfolder\test'
    
    Remove-Item 'test'
    Remove-Item 'hidden' -Force
    

1 个答案:

答案 0 :(得分:2)

如果您使用-ErrorAction Stop,那么您的第一个版本应该可以捕获所有错误:

function TestTryCatch($N, $Source, $Dest) {
    Write-Output "$N TestTryCatch $Source $Dest"
    try {Copy-Item $Source $Dest -ErrorAction Stop}
    catch {Write-Output "Error: $($error[0].exception.message)"}
}

这里的关键是Powershell区分终止和非终止错误,并且try {}不会捕获非终止错误。使用-ErrorAction Stop强制非终止错误来停止执行,从而导致它们被捕获。