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.
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?