11
votes

POWERSHELL: Attraper une exception projetée lors de l'impossibilité de démarrer un service

Je semble incapable d'attraper une exception projetée par start-service code>. Voici mon code:

try
{
    start-service "SomeUnStartableService"
    throw (new-object Exception("service started when expected not to start"))
}
catch [Microsoft.PowerShell.Commands.ServiceCommandException]
{
    write-host "got here"
}


0 commentaires

3 Réponses :


19
votes

Essayez / attrapez des travaux uniquement sur des erreurs de terminaison. Utilisez le paramètre ERRORACTION avec une valeur d'arrêt pour faire l'erreur d'une erreur de terminaison, puis vous pourrez l'attraper: xxx

mise à jour:

lorsque vous définissez € ErrorActionPreference Pour "arrêter" (ou utilisez -ErorAction STOP) Le type d'erreur que vous obtenez est ActionpreferencetopException, de sorte que vous pouvez l'utiliser pour attraper l'erreur. xxx


4 commentaires

Si $ errorActionPreference est défini sur l'arrêt, il ne suffit pas?


AS $ ErrorActionPreference est définie sur "Arrêter", il ne fait aucune différence en ajoutant -erroraction stop. Le code ci-dessus attrape une [exception] générale, mais je souhaite attraper uniquement l'exception projetée par Start-Service, ce qui signifie que je pouvais par exemple lancer une autre exception dans le bloc d'essai mais ne l'avez pas capturée dans la prise.


Désolé, j'ai raté cette partie. J'ai mis à jour le fil, vérifiez-le.


Cette actionPreferencestopException est vraiment non distusif. Merci d'avoir expliqué! Je pensais que Powershell n'ignorait que la valeur de $ errorActionPréférence lorsque j'ai essayé d'attraper l'exception que je veux vraiment attraper.



2
votes

Pour découvrir votre exception, vous pouvez utiliser:

try
{
  start-service "SomeUnStartableService" -ea Stop
}
catch [SystemException]
{
 write-host "got here"
}


2 commentaires

Cela renvoie Microsoft.Powershell.comMands.ServiceCommandException, qui est ce que j'essayais d'attraper ci-dessus.


La modification aide et je suppose que cela convient au but de l'avoir voté, mais je ne pense pas que cela puisse être la réponse car elle est un peu de contournement.



3
votes

Je ne limite généralement pas la phrase d'accueil mais gérez les exceptions avec des tests logiques dans le bloc de capture:

try
{
  start-service "SomeUnStartableService" -ea Stop
}
catch
{
   if ( $error[0].Exception -match "Microsoft.PowerShell.Commands.ServiceCommandException")
   {
      #do this
   }
   else
   {
      #do that
   }
}


1 commentaires

C'est dommage que ce ne soit pas aussi propre que de saisir l'exception spécifique, mais je suppose que si cela ne peut pas être fait c'est la meilleure chose à faire.