C'est très étrange.
Je suis passé par ItemNotFoundException
et testé les classes multiples suivantes catch
es pour voir ce que serait l'attraper :
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'
}
Il s'avère que la sortie était 'RuntimeException'
. J'ai également essayé avec une exception différente CommandNotFoundException
:
try {
do-nonexistent-command
}
catch [System.Management.Automation.CommandNotFoundException] {
write-host 'CommandNotFoundException'
}
catch {
write-host 'well, darn'
}
Ce résultat 'CommandNotFoundException'
correctement.
Je me souviens vaguement avoir lu ailleurs (mais je n'ai pas pu le retrouver) des problèmes à ce sujet. Dans ces cas-là, lorsque le filtrage des exceptions ne fonctionnait pas correctement, ils capturaient la plus proche Type
ils ont pu et ensuite utiliser un switch
. Ce qui suit vient de se produire Exception
au lieu de RuntimeException
mais c'est le switch
équivalent de mon premier exemple qui vérifie tous les types de base de 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'}
}
}
Cela écrit 'ItemNotFound'
comme il se doit.