0%

Fouten, validatie en debuggen · oefening

Werp een fout op bij ongeldige gegevens

De vorige les controleerde invoer vóór het omzetten. Maar een herbruikbare functie kan niet bij elke aanroeper gaan staan en vragen: “Weet je het zeker?” Ze moet haar eigen regel ook bewaken.

Stel dat een functie een titel nodig heeft. Alleen spaties vormen geen bruikbare titel:

def clean_required_title(title):
    clean_title = title.strip()

    if not clean_title:
        raise ValueError("A title cannot be empty")

    return clean_title

De voorwaarde gebruikt truthiness uit hoofdstuk 9. Na .strip() is een lege string falsy, dus not clean_title is waar wanneer er geen tekst overblijft.

Werp een specifieke fout op

De beslissende regel is:

raise ValueError("A title cannot be empty")

ValueError zegt dat het soort waarde acceptabel is (er is een string meegegeven), maar dat de inhoud hier niet geschikt is. De tekst tussen ronde haken legt uit welke regel is overtreden.

Wanneer Python raise bereikt, stopt de huidige functie direct. De uitvoering gaat niet verder naar de return eronder.

Dat maakt raise anders dan het teruggeven van een foutmelding:

  • return geeft de aanroeper een normaal resultaat;

  • raise meldt dat de functie geen normaal resultaat kon opleveren.

Voer het geldige geval uit en maak het daarna ongeldig

Voer dit voorbeeld één keer uit. Verwijder daarna Dune uit de string en voer het opnieuw uit. Bij de tweede uitvoering zie je de ValueError en het bijbehorende bericht.

Try it

Het is de bedoeling dat je hier een fout ziet. Voor één keer is het rode bericht het geslaagde geval: de functie bewaakte haar regel in plaats van stilzwijgend onbruikbare gegevens terug te geven.

Plaats validatie vóór het normale resultaat

De volgorde is belangrijk:

  1. schoon de titel op;

  2. controleer de opgeschoonde titel;

  3. werp een fout op als die ongeldig is;

  4. geef anders de geldige titel terug.

Zo blijft het normale pad makkelijk te lezen. De volgende les laat zien hoe een aanroeper een specifieke fout kan opvangen en erop kan reageren.

Wat gebeurt er wanneer clean_required_title(" ") de regel met raise bereikt?

Bewaak een verplichte cursistnaam

De oefening gebruikt hetzelfde patroon met een cursistnaam. Schoon de tekst op, wijs een leeg resultaat af en geef alleen een geldige naam terug.

Opdracht

Maak clean_required_name(name) af.

  1. Gebruik .strip() en sla het resultaat op in clean_name.

  2. Werp als clean_name leeg is een ValueError op met precies het bericht "A name cannot be empty".

  3. Geef anders clean_name terug.

Gebruik het truthinesspatroon voor een lege string uit hoofdstuk 9: if not clean_name:. Behoud de voorbeeldaanroep zodat het programma Ada afdrukt.