Pisząc skrypt masz możliwość obsługi błędów na kilka sposobów, a te najpopularniejsze to
- blok try / catch
- instrukcja trap
Zawsze polecam stosowanie try catch, bo nie jest to trudne rozwiązanie, a pozwala na dość elastyczną obsługę błędów. Zasada jest prosta. W bloku try umieść instrukcje, które potencjalnie mogą spowodować błąd, a obsługę błędu wykonaj w catch. Takich bloków try catch można w skrypcie umieścić więcej i dzięki temu można w różny sposób reagować na różne błędy.
function Get-IP($hostName) { [System.Net.Dns]::GetHostAddresses("www.$name.com") } $name = 'kaskdicxoienrh' Try { Get-IP $name } catch { Write-Warning "$name - bad name - terminating script" return }
Chociaż powyższy skrypt mógł składać się z wielu poleceń, moja obsługa błedu zareagowała tak nerwowo tylko w tej jednej linijce. mam pełną władzę nad tym jak obsłużyć bład.
Nieco inaczej działa trap. Trap to instrukcja umieszczana gdzieś na początku skryptu lub funkcji, która definiuje, co zrobić, jeśli gdzieś poniżej dojdzie do błędu. (Dokładniej rzecz biorąc można określać przy jakim rodzaju błędu, który blok trap ma się uruchomić). Generalnie jednak nie wiesz, która linijka zawiodła kiedy doszło do błędu.
trap { Write-Warning "$name - bad name" break } $name = 'kaskdicxoienrh' Get-IP $name Write-Host "OK"
Taki zapis w przypadku długiego skryptu obsłuży każdy błąd w ten sam sposób… Nawet jeśli użyjesz postaci:
trap [System.Management.Automation.MethodInvocationException] { Write-Warning "$name - bad name" break } $name = 'kaskdicxoienrh' Get-IP $name Write-Host "OK "
to wszystkie błędy MethodInvokationException obsłużyłeś tak samo, nieważne czy ich znaczenie w skrypcie było krytyczne czy nie.
Bardzo spodobało mi się porównanie z http://blogs.msdn.com/b/powershell/archive/2009/06/17/traps-vs-try-catch.aspx, a zwłasza pierwszy punk porównania:
- begin try – for developers
- trap – for administrators
Więcej o obsłudze błędów oczywiście na kursie powershell dla początkujących i nie tylko…