Powershell -czego używać try/catch czy trap?

7-Gru-2015

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…
Kurs_powershell_landscape_620

 

 

Dodaj komentarz:

Autor: Rafał Kraik