Alla guider PowerShell

Try-Catch — Felhantering som separerar proffs från nybörjare

Try-Catch är hur du hanterar fel i PowerShell utan att skriptet kraschar. Men många skriver Try-Catch fel, eller använder det inte alls. Här lär du dig varför det är viktigt, och hur du skriver det rätt.

2026Adam Halvars8 min läsning

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?

Frågor om det här?

Hör av dig — eller läs fler guider.

Kontakta mig Alla guider