Przykład obsługi błędów zakończającego jest poniżej:
"Before"; throw "Error!"; "After"Wtedy w konsoli mamy:
Before Error! At line:2 char:1 + throw "Error!"; + ~~~~~~~~~~~~~~ + CategoryInfo : OperationStopped: (Error!:String) [], RuntimeException + FullyQualifiedErrorId : Error!Na ogół taki typ obsługi błędów stosuje się gdy:
- występują składniowe błędy w skrypcie
- alarmować o błędach krytycznych
- rzucanie błędów w bloku try-catch-finally (tak jest, PS też ma try-catcha)
Stosuje się blok try-catch, aby przechwycić taki błąd:
try { throw "Error!"; } catch { Write-Host "Catch" }Więcej o try-catch można poczytać w about_Try_Catch_Finally.
Do drugiego typ (non-terminating) obsługi błędów stosuje się komendę Write-Error, a przykład jest przedstawiony poniżej:
"Before"; Write-Error "Error!"; "After"
Na końcu komunikatu jest tekst "After":
Before "Before"; Write-Error "Error!"; "After" : Error! + CategoryInfo : NotSpecified: (:) [Write-Error], WriteErrorException + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException AfterTyp obsługi błędów nie zakończający działanie stosuje się gdy:
- chcemy zarejestrować błąd
- błąd nie przeszkadza w dalszym działaniu skryptu
- błąd jest przy wywołaniu elementów ( metod, właściwości) na obiektach .NETowych
Oprócz tych komend, ważne są zmienne pomocnicze
- $? - Jeżeli prawda to wywołanie zakończyło się bez błędu. Jeżeli fałsz to oznacza, że był błąd lub częściowy sukces (w trakcie wywoływania)
dir | %{ $?;$_.ABc(); $?}I na outpucie mamy:
True Method invocation failed because [System.IO.DirectoryInfo] does not contain a method named 'ABc'. At line:1 char:13 + dir | %{ $?;$_.ABc(); $?} + ~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [], RuntimeException + FullyQualifiedErrorId : MethodNotFound False True Method invocation failed because [System.IO.DirectoryInfo] does not contain a method named 'ABc'. At line:1 char:13 + dir | %{ $?;$_.ABc(); $?} + ~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [], RuntimeException + FullyQualifiedErrorId : MethodNotFound FalseDla wywołanych programów konsolowych jest sprawdzany ExitCode. Jeżeli ma on wartość 0 to $? będzie przyjmował wartość true.
- $Error - jest to ArrayLista z błędami jakie wystąpiły w trakcie aktualnej sesji. Najmłodszy błąd jest dodawany na początek listy.
- $LastExitCode - Przy wywoływaniu aplikacji konsolowej, zmienna zawiera wartość ExitCode ostatniej uruchamianej aplikacji
- $MaximumErrorCount - Określa ilość trzymanych błędów w kolekcji $Error. Domyślna wartość jest 256 a maksymalna ilość zapisanych błędów może być 32 768.
- $ErrorActionPreference - Określa sposób zachowania się konsoli kiedy wystąpi błąd. Może przujmować takie wartości jak "SilentlyContinue", "Continue", "Stop", i "Inquire". Domyślna wartość to "Continue". Przykład użycia zapytania w momencie wystąpienia błędu jest przedstawiony poniżej:
$ErrorActionPreference ="inquire" Write-Error "pop up text error"
- $ErrorView - określa sposób wyświetlenia błędów na host'ie. Domyślna wartość to "NormalView", ale w przypadku produkcyjnego środowiska można zmienić na "CategoryView", aby dostać zwięzły jednolinijkowy komunikat
Czasami przy niektórych komendach, które mogą zwrócić błąd można zastosować parametry -ErrorAction SilentlyContinue, aby komunikaty o błędach były 'przemilczane'. Jest to bardzo dobrze rozwiązanie, gdyż zmienna $ErrorActionPreference jest zmienną globalna dla wszystkich poleceń.
Następnym razem napisze coś o trapie i try-catch