2011-07-13 16 views
7

Wydaje mi się, że nie mogę uchwycić wyjątku zgłoszonego przez Start-Service. Tu jest mój kodu:Powershell: Wyjątek catch wysłany, gdy nie można uruchomić usługi

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

Kiedy uruchamiam to jest wyjątek, ale nie złapał:

*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 jest ustawiony na Stop, więc nie powinno to być problemem.

Po zmianie kodu na catch [Exception], wyjątek zostaje wychwycony i drukowany jest tekst "tu".

Czy start-service rzucić ServiceCommandException lub coś innego? Wygląda na to, że jest, ale nie mogę tego złapać!

--- Edit ---

Idealnie mógłbym napisać następujące polecenie, a wyjątek jeśli start-service nie wyjątek, a tylko złapać wyjątek rzucony przez 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" 
} 

Odpowiedz

1

zwykle don Ogranicz limit połowu se ale obsługiwać wyjątki z testów logicznych w obrębie bloku catch:

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

Może nie tak czyste, i może skutkować ogromnymi blokami połowów. Ale jeśli działa ...;)

+0

Szkoda, że ​​nie jest tak schludny, jak uchwycenie określonego wyjątku, ale przypuszczam, że jeśli nie można tego zrobić, to jest kolejna najlepsza rzecz. – Jack

10

Try/Catch działa tylko w przypadku błędów zakończenia. Użyj parametru ErrorAction o wartości przystanku aby Błąd błąd obciążeniowy i wtedy będziesz mógł go złapać:

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

UPDATE:

Kiedy $ ErrorActionPreference do „stop” (ustawienie lub użyj -ErrorAction Stop) typem błędu jaki uzyskasz jest ActionPreferenceStopException, dzięki czemu możesz go użyć do złapania błędu.

$ErrorActionPreference='stop' 

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

}

+0

jeśli $ ErrorActionPreference jest ustawiony na Stop to za mało? – JPBlanc

+0

Jako że wartość $ ErrorActionPreference jest ustawiona na "Stop", nie ma znaczenia dodawanie -Brak zatrzymania. Powyższy kod przydaje się w ogólnym [wyjątku], jednak chcę uchwycić tylko wyjątek wyrzucony przez start-service, co oznacza, że ​​mógłbym na przykład rzucić kolejny wyjątek w bloku try, ale nie zostałby złapany w haczyku. – Jack

+0

Przepraszam, tęskniłem za tą częścią. Zaktualizowałem wątek, sprawdź to. –

0

aby odkryć swoje wyjątek można użyć:

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

Zmieniano: Oto rodzaj obwodnicy z SystemException

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

Powoduje zwrócenie wyjątku Microsoft.PowerShell.Commands.ServiceCommandException, który próbowałem przechwycić powyżej. – Jack

+0

Edycja pomaga i przypuszczam, że pasuje do celu, więc zagłosowałem, ale nie sądzę, że może to być odpowiedź, ponieważ jest to trochę obejście problemu. – Jack

Powiązane problemy