PowerShell尝试,捕获,自定义终止错误消息

时间:2014-07-26 11:26:15

标签: powershell error-handling

有没有办法自定义终止错误的错误消息?

在下面的示例中,我想最后得到一个Try部分,并通过组合两个脚本块来收集一个Catch部分中的所有错误。我的问题是$error生成的Import-csv不够具有描述性,我希望在Failed CSV-File import c:\test.csv消息中包含$error文字。

感谢您的建议。

脚本块1

Try {
    $File = (Import-Csv -Path c:\test.csv)
}
Catch {
    throw $error[0].Exception.Message | Send-Mail $ScriptAdmin "FAILED CSV-File import"
}

脚本块2

try {
    if(!(Test-Path $LogFolder -PathType Container)) {throw "Can't find the log folder: '$LogFolder'"}
    $Credentials = Import-Credentials $UserName $PasswordFile
}
catch {
    throw $Error[0].Exception.Message | Send-Mail $ScriptAdmin "FAILURE"
}

解决方法

如果导入文件存在,可能的解决方案是首先使用test-path进行检查,然后使用自定义消息创建throw。但我想知道是否可以在一行代码中处理它而不首先使用test-path

最佳解决方案(感谢mjolinor):

try {
    $File = (Import-Csv -Path $ImportFile -Header "A", "B", "C", "D" | Where { $_.A -NotLike "#*" })
    if(!(Test-Path $LogFolder -PathType Container)) {throw "Can't find the log folder: '$LogFolder'"}
    $Credentials = Import-Credentials $UserName $PasswordFile
}
catch {
    Switch -Wildcard ($Error[0].Exception)
        {
           "*$ImportFile*"
           { $FailType = "FAILED CSV-File import" }

           "*$LogFolder*"
           { $FailType = "FAILED Log folder not found" }

           "*Import-Credentials*"
           { $FailType = "FAILED Credential import" }

           Default
           { $FailType = "FAILED Unrecognized error" }

         }
       Write-Warning $Error[0].Exception.Message
       throw $Error[0].Exception.Message | Send-Mail $ScriptAdmin $FailType
}
  • 确保您创建的advanced-function(如上面的Import-Credentials)包含throw部分中的函数名称。所以我们可以在catch块中过滤掉它。

1 个答案:

答案 0 :(得分:3)

这样的事,也许?

Try {
      $File = (Import-Csv -Path c:\test.csv)

      if(!(Test-Path $LogFolder -PathType Container)) 
      { throw "Can't find the log folder: '$LogFolder'" }

      $Credentials = Import-Credentials $UserName $PasswordFile

      }

catch {
        Switch -Wildcard ($Error[0].CategoryInfo)
        {
           '*[Import-CSV]*' 
           { $FailType = 'Import CSV failed' }

           '*[Test-Path]*'
           { $FailType = 'LogFolder not found' }

           '*[Import-Credentials]*'
           { $FailType = 'Credential import failed' }

           Default
           { $FailType = 'Unrecognized error' }

         }

         $Error[0].Exception.Message | Send-Mail $ScriptAdmin $FailType

       }

编辑(出于某种原因,我无法发表评论):

我应该指出它没有经过测试,并且更多的是作为模式而非完成的解决方案,它似乎已经完成了它的目的。

@BartekB - 我习惯使用$ Error [0]而不是$ _,因为它看起来更直观,更直观,不太可能被经验不足的人误解,可能会在以后继承代码。