Drop links or images here to add them to the editor.

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.

De try/catch-structuur

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:

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.

Voorbeeld: Celsius naar Fahrenheit

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 / 5 is aangepast naar 9.0 / 5. Door één van beide getallen als kommagetal te schrijven, voert C# nu een echte deling uit (1.8 in plaats van 1) en klopt de omzetting wel.