Powershell尝试/赶上/最后

我最近写了一个很好的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]的输出。 很显然,我想在第一个方块中看到 – 我错过了什么? 谢谢

-ErrorAction Stop正在改变你的事情。 尝试添加这个,看看你得到什么:

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

这很奇怪。

我通过了ItemNotFoundException的基类,并testing了下面的多个catch ,看看会有什么结果

 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' } 

事实certificate,输出是'RuntimeException' 。 我也尝试了一个不同的exceptionCommandNotFoundException

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

输出'CommandNotFoundException'正确。

我依稀记得在别处读书(虽然我再也找不到)这个问题了。 在这种情况下,exception过滤不能正常工作,他们会赶上最接近的Type ,然后使用switch 。 下面只是捕获Exception而不是RuntimeException ,但是是等同于我的第一个例子的switch ,它检查所有基types的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' ,它应该。