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'
,它应该。