2009-06-19 15 views
7

PowerShell to dziwaczna mieszanka .bat i .NET. W .bat, sprawdzasz wyjście poziomów błędu i stderr poleceń. W .NET łapiecie wyjątki.Jaki jest właściwy sposób obsługi błędów w PowerShell?

W jaki sposób cmdlets zwracają błędy? Czy rzucają wyjątki, gdy im się nie powiedzie, czy też ustawiają $? zamiast? Czy to jest konfigurowalne?

Zakładam również, że funkcje .NET, które wywołuję w PowerShell, zawsze będą zgłaszać wyjątki i nie będą automatycznie przechwytywane przez powłokę i przekształcane w błędy. Czy to jest poprawne?

Może naprawdę powinienem zapytać: jaki jest dobry artykuł, który pasuje do wszystkiego? Wygląda na to, że wielu inżynierów takich jak ja, którzy mają doświadczenie w programach cmd .bat i .NET, zastanawiają się dokładnie, jak powinniśmy robić rzeczy w tym odważnym, nowym świecie Posh.

Odpowiedz

9

Dla poszczególnych apletów poleceń, jest parametr zwany -erroraction. Możliwe wartości to SilentlyContinue, Stop, Continue lub Inquire. Można również określić globalną zmienną o nazwie $ errorpreference dla dowolnej z tych opcji.

W V1 można użyć słowa kluczowego pułapki. Istnieje pretty good, concise article, który opisuje kluczowe różnice pomiędzy pułapkami i składnią try/catch/finally, która została dodana w V2.

Oto krótki przykład użycia oświadczenia pułapek, pierwszy jest dla typu określon wyjątku, a drugi to ogólny połów wszystko pułapka błąd

trap {"Other terminating error trapped" } 
trap [System.Management.Automation.CommandNotFoundException] 
     {"Command error trapped"} 
1/$null 
+0

Dokładnie to, czego potrzebowałem, dziękuję bardzo! – scobi

+0

Nazwa zmiennej globalnej to $ ErrorActionPreference, a nie $ errorpreference: http://blogs.msdn.com/powershell/archive/2008/04/10/erroraction-update.aspx –

0

Uważam, że Posh to wszystko .Net. Większość koncepcji działających w .Net powinna działać w Posh.

Do obsługi błędów można użyć polecenia Try..catch. Możliwe jest również "pułapkowanie" błędów i określenie własnego zestawu instrukcji do wykonania w przypadku błędu.

Gorąco polecam ten wbudowany pomocy:

Get-Help about_Errors 
Get-Help about_Trap 
+0

Więc może został usunięty w V2CTP3 ale tam nie ma about_errors or about_trap. A twoja odpowiedź to rodzaj podsumowania, skąd pochodzi moje pytanie. Posh jest .NET-y, wiem o try-catch itp., Ale to naprawdę nie pomaga odpowiedzieć na którekolwiek z pytań, które mam. – scobi

Powiązane problemy