Waarom foutafhandeling?
Zelfs perfect geschreven code kan fouten tegenkomen: een bestand dat niet bestaat, een netwerk dat uitvalt, een getal dat gedeeld wordt door nul. Als je die fouten negeert, crasht je programma. Met try/catch vang je ze op en handel je ze netjes af.
Basis: try en catch
try
{
string tekst = File.ReadAllText("tekening.txt");
Console.WriteLine(tekst);
}
catch (FileNotFoundException ex)
{
Console.WriteLine($"Bestand niet gevonden: {ex.Message}");
}
catch (UnauthorizedAccessException ex)
{
Console.WriteLine($"Geen leesrechten: {ex.Message}");
}
C# loopt de catch-blokken van boven naar beneden af en voert het eerste uit dat overeenkomt met het fouttype.
finally: altijd uitgevoerd
Code in finally wordt altijd uitgevoerd — of er nu een fout was of niet. Gebruik het om resources vrij te geven:
StreamReader? lezer = null;
try
{
lezer = new StreamReader("data.csv");
Console.WriteLine(lezer.ReadToEnd());
}
catch (Exception ex)
{
Console.WriteLine($"Fout: {ex.Message}");
}
finally
{
lezer?.Close(); // wordt altijd uitgevoerd
}
using: resources automatisch vrijgeven
Voor objecten die IDisposable implementeren (bestanden, verbindingen, ...) is using de eenvoudigste manier:
try
{
using StreamReader lezer = new StreamReader("data.csv");
Console.WriteLine(lezer.ReadToEnd());
// lezer wordt automatisch gesloten aan het einde van het using-blok
}
catch (FileNotFoundException)
{
Console.WriteLine("Bestand niet gevonden.");
}
Een fout gooien (throw)
void SetLayerName(string naam)
{
if (string.IsNullOrWhiteSpace(naam))
throw new ArgumentException("Laagnaam mag niet leeg zijn.", nameof(naam));
// ...
}
Algemene Exception opvangen
Als je niet weet welk type fout er kan optreden, gebruik dan de basisklasse Exception. Zet dit altijd als laatste catch:
catch (FileNotFoundException ex)
{
// specifiek geval
}
catch (Exception ex)
{
// alles wat niet hierboven valt
Console.WriteLine($"Onverwachte fout: {ex.Message}");
}
Best practices
- Vang fouten zo specifiek mogelijk op
- Log de fout (
ex.Message,ex.StackTrace) zodat je kunt debuggen - Gooi nooit een fout weg door een lege catch:
catch { }— dit verbergt problemen - Gebruik
finallyofusingom resources te sluiten
In de volgende post leren we namespaces en hoe je een class library aanmaakt — de basis voor een AutoCAD add-in.
Comments
No comments yet — be the first!
Leave a comment
Sign in to skip moderation — anonymous comments are reviewed before appearing.