Du skriver ett PowerShell-skript. Det fungerar perfekt på din dator. Du kör det på en annan server — och det kraschar med ett felmeddelande. Skriptet stoppar mittvägs, resultaten sparas inte, ingenting görs klart.

Det är en dålig användarupplevelse. Det är också amatörmässigt.

Med Try-Catch kan du säga till PowerShell "försök göra detta — men om något går fel, gör DET istället". Det gör dina skript robusta och professionella.

Vad är Try-Catch?
Grunderna förklarade

Try-Catch är ett kontrollflöde i PowerShell. Du skriver kod i Try-blocket. Om något går fel, PowerShell hoppar till Catch-blocket istället för att krascha.

Det gör ditt skript robust. Det kan hantera problem utan att förstöra allt.

💡 Try-Catch är skillnaden mellan ett skript som fungerar ibland och ett som fungerar Always.
ENKLASTE EXEMPEL
Try { Get-ChildItem C:\NonExistentFolder } Catch { Write-Host "Mappen finns inte!" }

Här försöker PowerShell att lista en mapp som inte finns. Normalt skulle det ge ett fel och krascha. Men med Try-Catch fångar vi felet och skriver ett användarvänligt meddelande istället.

MED FELMEDDELANDET
Try { Get-ChildItem C:\NonExistentFolder -ErrorAction Stop } Catch { Write-Host "Fel: $($_.Exception.Message)" }

$_ är felobjektet. $_.Exception.Message är felmeddelandet.

EXEMPEL 2: MED FINALLY
Try { # Försök att göra något Write-Host "Gör något..." } Catch { # Om fel — hantera det Write-Host "Fel inträffade: $($_.Exception.Message)" } Finally { # Detta körs alltid, oavsett Write-Host "Färdig, oavsett resultat" }

Finally körs alltid — oavsett om det blev fel eller inte. Använd det för att rensa upp (stäng filer, frigör resurser, osv).

"Try-Catch är inte för att patera fel — det är för att hantera fel professionellt."
Viktigt: ErrorAction Stop
Utan detta fungerar inte Try-Catch

Många cmdlets i PowerShell avslutar inte körningen vid fel — de skriver bara ett varningsmeddelande. Try-Catch fångar inte dessa icke-avslutande fel automatiskt.

Du behöver -ErrorAction Stop för att tvinga PowerShell att behandla alla fel som kritiska:

UTAN -ERRORACTION STOP (FUNKAR INTE)
Try { Get-ChildItem C:\NonExistent } Catch { Write-Host "Fel!" } # Felet skrivs ut, men Catch triggas inte!
MED -ERRORACTION STOP (FUNKAR)
Try { Get-ChildItem C:\NonExistent -ErrorAction Stop } Catch { Write-Host "Fel!" } # Nu triggas Catch korrekt!

Regel: Alltid -ErrorAction Stop i Try-block!

Specifik felhantering — Catch olika slags fel
Inte alla fel är samma

Du kan fånga olika typer av fel och hantera dem olika:

SPECIFIK FELHANTERING
Try { [int]$number = "inte ett nummer" } Catch [System.InvalidCastException] { Write-Host "Du kan inte konvertera en text till nummer!" } Catch [System.IO.FileNotFoundException] { Write-Host "Filen finns inte!" } Catch { # Alla andra fel Write-Host "Något gick fel: $($_.Exception.GetType().Name)" }

Denna struktur låter dig hantera vissa fel på ett sätt, och andra fel på annat sätt.

Vanliga misstag och hur du undviker dem
Skriva Try-Catch rätt

Misstag 1: Glömma -ErrorAction Stop

Som vi sa — utan detta fungerar Try-Catch inte för alla fel. Du måste ha det på alla cmdlets i Try-blocket som kan ge fel.

Misstag 2: Catch all-fel utan att loggit dem

DÅLIGT - TYST FEL
Try { Something-That-Fails -ErrorAction Stop } Catch { # Ingenting — felet döljs helt! }
BÄTTRE - LOGGA FELET
Try { Something-That-Fails -ErrorAction Stop } Catch { Write-Host "Fel: $($_.Exception.Message)" Write-Host "Stack trace: $($_.ScriptStackTrace)" }

Alltid logga fel! Du behöver senare veta vad som gick fel.

Misstag 3: For-loop utan felhantering

DÅLIGT - STOPPAR PÅ FÖRSTA FEL
foreach ($server in $servers) { Get-Service -ComputerName $server } # Om server2 är offline — loopen stoppar!
BÄTTRE - HANTERA VARJE FEL
foreach ($server in $servers) { Try { Get-Service -ComputerName $server -ErrorAction Stop } Catch { Write-Host "Kunde inte nå $server : $($_.Exception.Message)" } } # Loopen fortsätter även om en server är offline
⚠️ Try-Catch i loopar är VIKTIGT — utan det stoppar ett fel hela körningen.
Verkligt exempel från praktiken
Scenario: Skript som kopierar filer från flera servrar
VERKLIGT EXEMPEL - ROBUST FILKOPIERA
$servers = @("SERVER01", "SERVER02", "SERVER03") $source = "C:\Logs\*.log" $destination = "C:\BackupLogs\" foreach ($server in $servers) { Try { Write-Host "Kopierar från $server..." Copy-Item -Path "\\$server\$source" -Destination $destination -ErrorAction Stop Write-Host "✓ Lyckades för $server" } Catch [System.IO.FileNotFoundException] { Write-Host "✗ Loggar finns inte på $server" } Catch [System.UnauthorizedAccessException] { Write-Host "✗ Ingen åtkomst till $server" } Catch { Write-Host "✗ Fel på $server : $($_.Exception.Message)" } Finally { Write-Host "---" } } Write-Host "Alla servrar har bearbetats."

Utan Try-Catch skulle skriptet stanna på den första offline-servern. Med Try-Catch fortsätter det och rapporterar alla problem.

För- och nackdelar
Try-Catch i ett nötskal

✓ Fördelar

  • Skriptet kraschar inte på fel
  • Du kan hantera fel professionellt
  • Du kan logga vad som gick fel
  • Du kan fortsätta körningen
  • Kan specifikt hantera olika feltyper
  • Finally kan rensa upp
  • Gör skriptet robust

✗ Nackdelar

  • Kräver -ErrorAction Stop
  • Kan dölja fel om du inte loggar
  • Gör koden längre och mer komplex
  • Feltyper kan vara svåra att minnas
  • Catch all kan förstöra debugging
  • Kan bli för många Catch-block

// SNABB GUIDE: TRY-CATCH STRUKTUR

  • Try { ... } = försök göra detta
  • -ErrorAction Stop = tvinga fel att avslutas
  • Catch { ... } = om fel, gör detta
  • Catch [SpecificException] { } = för en viss feltyp
  • Catch { } = för alla andra fel
  • Finally { } = körs alltid, oavsett
  • $_.Exception.Message = felmeddelandet

// CHECKLIST: TRY-CATCH BÄSTA PRAXIS

  • Har alla cmdlets -ErrorAction Stop?
  • Loggar du felen?
  • Kan skriptet fortsätta om något fel inträffar?
  • Använder du specifika Catch-block för olika fel?
  • Rengör du resurser i Finally?
  • Testar du vilka fel som faktiskt kan inträffa?
  • Testade du med server/fil offline?