Powershell: выдается исключение при запуске службы - PullRequest
10 голосов
/ 13 июля 2011

Кажется, я не могу отловить исключение, выданное Start-Service.Вот мой код:

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

Когда я запускаю это, исключение выдается, но не перехватывается:

*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 установлен на Стоп, так что это не должно бытьпроблема.

Когда я изменяю свой код на catch [Exception], исключение перехватывается и печатается "получено".

start-service выдает ServiceCommandException или что-то еще?Это выглядит так, как будто это так, но я не могу его поймать!

--- Edit ---

В идеале я мог бы написать следующее и выдать исключение, если start-service не выдалисключение, и только поймать исключение, выданное 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"
}

Ответы [ 3 ]

13 голосов
/ 13 июля 2011

Try / Catch работает только при устранении ошибок.Используйте параметр ErrorAction со значением Stop, чтобы сделать ошибку завершающей ошибкой, и тогда вы сможете ее перехватить:

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

UPDATE:

Когда для $ ErrorActionPreference установлено значение'stop' (или используйте -ErrorAction Stop) тип ошибки, который вы получаете - ActionPreferenceStopException, так что вы можете использовать его для обнаружения ошибки.

$ErrorActionPreference='stop'

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

}

3 голосов
/ 13 июля 2011

Обычно я не ограничиваю фразу-ловушку, а обрабатываю исключения с помощью логических тестов в блоке-ловушке:

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

Может быть, не так чисто, и может привести к огромным уловам блоков. Но если это работает ...;)

1 голос
/ 13 июля 2011

Чтобы обнаружить свое исключение, вы можете использовать:

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

Отредактировано: Вот своего рода обход с SystemException

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