C# håndterer feil med unntak som fanges via try/catch/finally. Riktig unntaksbehandling betyr å fange spesifikke unntakstyper, rydde opp i ressurser (ofte med using), lage meningfulle egendefinerte unntak, og ikke stilletiende ignorere feil.
C# håndterer feil med unntak som fanges via try/catch/finally. Riktig unntaksbehandling betyr å fange spesifikke unntakstyper, rydde opp i ressurser (ofte med using), lage meningfulle egendefinerte unntak, og ikke stilletiende ignorere feil.
try
{
var data = RiskyOperation();
}
catch (FileNotFoundException ex) // catch SPECIFIC types (most specific first)
{
Console.WriteLine($"File missing: {ex.Message}");
}
catch (IOException ex)
{
Log(ex);
throw; // re-throw, PRESERVING the stack trace (not `throw ex`)
}
catch (Exception ex) // catch-all (last) — base of all exceptions
{
Log(ex);
}
finally
{
Cleanup(); // ALWAYS runs (success, exception, or return)
}
Fang spesifikke unntakstyper først, bruk Exception som en siste catch-all, og finally for opprydding som alltid må kjøres. Viktig: bruk throw; (ikke throw ex;) for å kaste på nytt — det bevarer den opprinnelige stablen.
if (amount < 0)
throw new ArgumentException("Amount must be positive", nameof(amount));
// a custom exception for your domain
public class InsufficientFundsException : Exception
{
public InsufficientFundsException(string message) : base(message) { }
}
throw new InsufficientFundsException("Balance too low");
// `using` guarantees Dispose() is called (close files/connections) even on exception
using (var file = new StreamReader("data.txt"))
{
var content = file.ReadToEnd();
} // file.Dispose() called automatically here
using var conn = new SqlConnection(...); // C# 8 simplified form
using-setningen sikrer at IDisposable-ressurser (filer, forbindelser) blir ordentlig avhentet — den foretrukne måten å håndtere ressursopprydding på, mer pålitelig enn manuell finally.
catch (Exception ex) when (ex.Message.Contains("timeout")) // exception filter (when)
{ ... }
✓ Catch SPECIFIC exceptions, not just Exception
✓ Use `using` for IDisposable resources (reliable cleanup)
✓ Don't swallow exceptions silently (empty catch) — log or re-throw
✓ Use `throw;` (not `throw ex;`) to preserve the stack trace
✓ Create meaningful custom exceptions; don't use exceptions for normal control flow
Riktig unntaksbehandling er essensiell for å bygge robuste og pålitelige C#-applikasjoner, så det er viktig å forstå det grundig.
Structuren try/catch/finally, fangst av spesifikke unntakstyper (for målrettet håndtering) med Exception som en siste catch-all, og finally for garantert opprydding er grunnleggende.
Flere C#-spesifikke beste praksis er særlig viktige: bruk av throw; istedenfor throw ex; når man kaster på nytt (en subtil men avgjørende detalj — throw ex; tilbakestiller stablen, noe som mister verdifull feilsøkingsinformasjon), bruk av using-setningen for IDisposable-ressurser (den foretrukne, pålitelige måten å sikre at filer, forbindelser og andre ressurser blir ordentlig ryddet opp i selv når unntak oppstår — mer robust enn manuelle finally-blokker, og sentral i C#s ressursbehandlingsmodell), og ikke stilletiende ignorering av unntak.
Å forstå unntaksbehandling — strukturen, spesifikke catch-setninger, egendefinerte unntak, den stablen-bevarende kastingen på nytt, og spesielt using for ressursopprydding — er viktig for å skrive pålitelig C# som håndterer feil elegant og forvalter ressurser riktig.
Siden håndterte unntak og ressurslekkasjer forårsaker virkelige pålitelighetsproblemer, og siden C# har spesifikke idiomer (mønsteret using, throw;-bevaring) som skiller robust kode fra skjør kode, er det viktig å mestre unntaksbehandling — det er hyppig brukt kunnskap for profesjonell C#-utvikling.