Powershell: Catch exception levée lorsqu'il est incapable de démarrer un service
Je semble incapable de rattraper une exception levée par Start-Service
. Voici mon code:
try
{
start-service "SomeUnStartableService"
}
catch [Microsoft.PowerShell.Commands.ServiceCommandException]
{
write-host "got here"
}
Lorsque je l'exécute, l'exception est levée, mais n'est pas pris:
*Service 'SomeUnStartableService' start failed.
At line:3 char:18
+ start-service <<<< "SomeUnStartableService"
+ CategoryInfo : OpenError: (System.ServiceProcess.ServiceController:ServiceController) [Start-Service], ServiceCommandException
+ FullyQualifiedErrorId : StartServiceFailed,Microsoft.PowerShell.Commands.StartServiceCommand*
$ErrorActionPreference
est réglé sur Arrêt, donc cela ne devrait pas être le problème.
Quand j'ai modifier mon code pour catch [Exception]
, l'exception est interceptée et "a obtenu ici" est imprimé.
Ne start-service
jeter un ServiceCommandException
ou autre chose? Il semble qu'il est mais je ne peux pas l'attraper!
--- Edit ---
Idéalement, je pourrais écrire la suite, et de lever une exception si start-service
ne jetez pas une exception, et seulement intercepter une exception levée par start-service
:
try
{
start-service "SomeUnStartableService"
throw (new-object Exception("service started when expected not to start"))
}
catch [Microsoft.PowerShell.Commands.ServiceCommandException]
{
write-host "got here"
}
OriginalL'auteur Jack | 2011-07-13
Vous devez vous connecter pour publier un commentaire.
J'ai l'habitude de ne pas limiter la catch-phrase, mais gérer les exceptions avec la logique des tests au sein de la catch-bloc:
Peut-être pas aussi propre, et peut entraîner d'énormes blocs catch. Mais si ça marche... 😉
OriginalL'auteur Torbjörn Bergstedt
Try/Catch ne fonctionne que sur la résiliation des erreurs. Utilisez le paramètre ErrorAction avec une valeur de Cesser de faire l'erreur de résiliation d'erreur et ensuite, vous serez en mesure de l'attraper:
Mise à JOUR:
Lorsque vous définissez $ErrorActionPreference de "stop" (ou utilisez -ErrorAction Stop) le type d'erreur que vous obtenez est ActionPreferenceStopException, de sorte que vous pouvez l'utiliser pour intercepter l'erreur.
}
$ErrorActionPreference est réglé sur "Arrêt", il ne fait aucune différence en ajoutant -erroraction Arrêter. Le code ci-dessus, les captures générale [Exception], mais je tiens à attraper l'exception levée par la start-service, ce qui signifie que je pourrait par exemple lancer une exception dans le bloc try, mais de ne pas l'avoir pris dans le catch.
Désolé, incontournable de la partie. Je l'ai mise à jour du fil, check it out.
Que ActionPreferenceStopException est vraiment pas intuitive. Merci pour l'explication! J'ai pensé PowserShell était juste ignorant la $ErrorActionPreference valeur lorsque j'ai essayé d'attraper l'exception que j'ai vraiment envie de l'attraper.
OriginalL'auteur Shay Levy
De découvrir votre exception, vous pouvez utiliser :
Édité : Ici c'est une sorte de dérivation avec
SystemException
La modification ne aider et je suppose que s'inscrit le but donc j'ai voté, mais je ne pense pas que cela peut être la réponse que c'est un peu une solution de contournement.
OriginalL'auteur JPBlanc