これは非常に奇妙です。
私は
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
キャッチ、しかしItemNotFoundException
のすべての基本型をチェックし、私の最初の例のswitch
と同等である:それが必要として
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'
を書き込みます。
'$ _。Exception'は' ItemProtocolsStopException'ではなく 'ItemNotFoundException'です。私は 'RuntimeException'から後者のドライブを賭けました。 –
あなたは正しいと思います。私はあなたのスイッチバージョンが好きです。スティーブがやろうとしていることに沿ったもの。 – Bruce
ここで問題となるのは、非終了エラーです。したがって、それが 'ItemNotFoundException'であっても、' ActionPreferencesStopException'でラップされない限り、実際にはスローされません。開発者として、これは私を悩ます。 :) – JasonMArcher