Zoals we al zagen, doet de gebruiker niet altijd wat jij van hem verwacht. Vraag je een getal in te vullen en doet hij dat niet, dan ontstaat er een uitvoeringsfout en zal je programma crashen. Het is dus heel belangrijk dat wij als programmeurs zulke situaties proberen op te vangen.
Hiervoor gebruiken we de try/catch-structuur. Die laat toe om een fout op te
vangen en bijvoorbeeld een nette melding te geven, waardoor het programma niet
zomaar crasht.
try
{
// code die een fout kan veroorzaken
}
catch (Exception)
{
// afhandeling van de fout
}
Het werkt zo:
try-gedeelte (Engels voor probeer) wordt beschermd
tegen fouten. C# probeert deze regels uit te voeren.catch-gedeelte
(Engels voor vang op). Daar vind je de afhandeling van de fout: je beslist
zelf wat er moet gebeuren, bijvoorbeeld een vriendelijke melding tonen.try-gedeelte goed, dan wordt het catch-gedeelte gewoon
overgeslagen.Het belangrijkste is dat het programma in beide gevallen blijft draaien: het crasht niet meer, maar handelt de fout zelf netjes af.
Tussen de haakjes na catch staat het type fout dat je opvangt. Exception
is het meest algemene type en vangt elke fout op. Toch is het meestal beter om
net díe fout op te vangen die je verwacht: zo verberg je geen andere, onverwachte
fouten per ongeluk achter dezelfde melding. In het voorbeeld hieronder weten we
welke fout kan optreden, dus vangen we die specifiek op.
We passen het voorbeeld van de omzetting van Celsius naar Fahrenheit aan. We
lezen een getal in van de gebruiker en zetten het om. Het inlezen én de
berekening plaatsen we in het try-gedeelte, want net daar kan het misgaan: typt
de gebruiker geen geldig getal, dan gooit Convert.ToDouble een
System.FormatException.
double celsius, fahrenheit;
try
{
celsius = Convert.ToDouble(Console.ReadLine());
fahrenheit = (9.0 / 5) * celsius + 32;
Console.WriteLine("Omgezet in graden Fahrenheit is dat " + fahrenheit);
}
catch (System.FormatException)
{
Console.WriteLine("Het programma kon niet worden uitgevoerd. Je gaf geen numerieke waarde in.");
}
Vult de gebruiker een geldig getal in, dan loopt alles in het try-gedeelte
zonder problemen en zie je de omgezette temperatuur:
Invoer:
37
Uitvoer:
Omgezet in graden Fahrenheit is dat 98.6
Typt de gebruiker daarentegen iets dat geen getal is, dan mislukt
Convert.ToDouble en springt C# naar het catch-gedeelte met de nette melding:
Invoer:
zevenendertig
Uitvoer:
Het programma kon niet worden uitgevoerd. Je gaf geen numerieke waarde in.
In beide gevallen blijft het programma overeind: zonder try/catch was het bij
de tweede invoer gecrasht met een onleesbare foutmelding.
Merk op dat we hier meteen ook de logische fout uit het vorige voorbeeld hebben rechtgezet: de deling
9 / 5is aangepast naar9.0 / 5. Door één van beide getallen als kommagetal te schrijven, voert C# nu een echte deling uit (1.8in plaats van1) en klopt de omzetting wel.