PowerShell尝试/ catch / finally

时间:2011-07-21 16:07:55

标签: powershell try-catch block

我最近编写了一个效果很好的PowerShell脚本 - 但是,我现在想升级脚本并添加一些错误检查/处理 - 但我似乎已经陷入了第一道障碍。为什么以下代码不起作用?

try {
  Remove-Item "C:\somenonexistentfolder\file.txt" -ErrorAction Stop
}

catch [System.Management.Automation.ItemNotFoundException] {
  "item not found"
}

catch {
  "any other undefined errors"
  $error[0]
}

finally {
  "Finished"
}

错误在第二个catch块中捕获 - 您可以看到$error[0]的输出。显然我想在第一个区块中抓住它。我错过了什么?

2 个答案:

答案 0 :(得分:35)

-ErrorAction Stop正在为你改变一些事情。尝试添加它,看看你得到了什么:

Catch [System.Management.Automation.ActionPreferenceStopException] {
"caught a StopExecution Exception" 
$error[0]
}

答案 1 :(得分:28)

这很奇怪。

我浏览了ItemNotFoundException个基类并测试了以下多个catch es,看看抓住它:

try {
  remove-item C:\nonexistent\file.txt -erroraction stop
}
catch [System.Management.Automation.ItemNotFoundException] {
  write-host 'ItemNotFound'
}
catch [System.Management.Automation.SessionStateException] {
  write-host 'SessionState'
}
catch [System.Management.Automation.RuntimeException] {
  write-host 'RuntimeException'
}
catch [System.SystemException] {
  write-host 'SystemException'
}
catch [System.Exception] {
  write-host 'Exception'
}
catch {
  write-host 'well, darn'
}

事实证明,输出为'RuntimeException'。我也尝试了另外一个异常CommandNotFoundException

try {
  do-nonexistent-command
}
catch [System.Management.Automation.CommandNotFoundException] {
  write-host 'CommandNotFoundException'
}
catch {
  write-host 'well, darn'
}

正确输出'CommandNotFoundException'

我依稀记得在其他地方(虽然我再也找不到)这个问题。在异常过滤无法正常工作的情况下,它们会捕获最接近的Type,然后使用switch。以下内容仅捕获Exception而不是RuntimeException,但是switch等同于我检查ItemNotFoundException的所有基本类型的第一个示例:

try {
  Remove-Item C:\nonexistent\file.txt -ErrorAction Stop
}
catch [System.Exception] {
  switch($_.Exception.GetType().FullName) {
    'System.Management.Automation.ItemNotFoundException' {
      write-host 'ItemNotFound'
    }
    'System.Management.Automation.SessionStateException' {
      write-host 'SessionState'
    }
    'System.Management.Automation.RuntimeException' {
      write-host 'RuntimeException'
    }
    'System.SystemException' {
      write-host 'SystemException'
    }
    'System.Exception' {
      write-host 'Exception'
    }
    default {'well, darn'}
  }
}

这样写'ItemNotFound'