我最近编写了一个效果很好的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]
的输出。显然我想在第一个区块中抓住它。我错过了什么?
答案 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'
。