开发者

Powershell: Catch exception thrown when unable to start a service

开发者 https://www.devze.com 2023-03-20 03:35 出处:网络
I seem unable to catch an exception thrown by Start-Service. Here is my code: try { start-service \"SomeUnStartableService\"

I seem unable to catch an exception thrown by Start-Service. Here is my code:

try
{
    start-service "SomeUnStartableService"
}
catch [Microsoft.PowerShell.Commands.ServiceCommandException]
{
    write-host "got here"
}

When I run this, the exception is thrown but not caught:

*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 is set to Stop, so this shouldn't be the problem.

When I alter my code to catch [Exception], the exception is caught and "got here" is printed.

Does start-service throw a ServiceCommandException or something else? It looks as though it is but I cannot catch it!

--- Edit ---

Ideally I could write the following, and throw an exception if start-service did not throw an exception, and only catch an exception thrown by 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"
}


Try/Catch works only on terminating errors. Use the ErrorAction parameter with a value of Stop to make the error a terminating error and then you'll be able to catch it:

try
{
    start-service "SomeUnStartableService" -ErrorAction Stop
}
catch
{
    write-host "got here"
}

UPDATE:

When you set $ErrorActionPreference to 'stop' (or use -ErrorAction Stop) the error type you get is ActionPreferenceStopException, so you can use it to catch the error.

$ErrorActionPreference='stop'

try
{
    start-service SomeUnStartableService
}
catch [System.Management.Automation.ActionPreferenceStopException]
{
    write-host "got here"
}

}


I usually don't limit the catch-phrase but handle the exceptions with logical tests within the catch-block:

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

Maybe not as clean, and may result in huge catch blocks. But if it works... ;)


To discover your exception you can use :

try
{
  start-service "SomeUnStartableService" -ea Stop
}
catch
{
 $_.exception.gettype().fullname
}

Edited : Here is a kind of bypass with SystemException

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


"Microsoft.PowerShell.Commands.ServiceCommandException" will also be true when not run elevated. Just saying.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号