Ontwikkel een Python Script voor Gegevensvalidatie en Foutafhandeling
description
Met deze prompt kan de gebruiker een Python script ontwikkelen dat helpt om invoer- of verwerkingsfouten vroegtijdig te detecteren en af te handelen, waardoor de betrouwbaarheid en gebruiksvriendelijkheid van toepassingen verbeteren. Het biedt inzicht in best practices voor validatie en foutafhandeling, wat het makkelijker maakt om onderhoudbare en robuuste code te schrijven.
prompt
Help me een Python script te schrijven dat gegevens valideert volgens de volgende regels: <voer de validatieregels in> en fouten afhandelt door duidelijke mel ...
try_prompt
generate_helper
disclaimerOnPageApi
tags
ai_answers
provider: openai
model: gpt-4.1-nano
Natuurlijk! Hier is een voorbeeld van een Python-script dat gegevens valideert volgens jouw specificaties:
```python
import re
def validate_email(email):
# Reguliere expressie voor eenvoudige e-mailvalidatie
patroon = r'^[\w\.-]+@[\w\.-]+\.\w+$'
if re.match(patroon, email):
return True
else:
return False
def validate_leeftijd(leeftijd_str):
try:
leeftijd = int(leeftijd_str)
if leeftijd > 0:
return leeftijd
else:
print("Fout: Leeftijd moet een positief geheel getal zijn.")
return None
except ValueError:
print("Fout: Leeftijd moet een geheel getal zijn.")
return None
def main():
# Voorbeeldgegevens
email_input = input("Voer je e-mailadres in: ")
leeftijd_input = input("Voer je leeftijd in: ")
# Validatie e-mail
if validate_email(email_input):
print("E-mail correct.")
else:
print("Fout: Ongeldig e-mailadres.")
# Alternatief: vraag opnieuw om invoer
# email_input = input("Voer een geldig e-mailadres in: ")
# Validatie leeftijd
leeftijd = validate_leeftijd(leeftijd_input)
if leeftijd is not None:
print(f"Leeftijd geregistreerd: {leeftijd}")
else:
# Alternatief: vraag opnieuw om invoer
# leeftijd_input = input("Voer een geldige leeftijd in: ")
if __name__ == "__main__":
main()
```
### Uitleg van de validatie en foutafhandeling:
- **E-mail validatie**:
- Gebruik van een reguliere expressie om te controleren of het e-mailadres een geldig formaat heeft.
- Bij een ongeldige invoer wordt een foutmelding gegeven.
- Alternatief: je kunt de gebruiker vragen opnieuw in te voeren totdat een geldig e-mail wordt ingevoerd.
- **Leeftijd validatie**:
- Poging om de invoer om te zetten naar een geheel getal (`int()`).
- Als dat lukt, controleer of de leeftijd positief is.
- Bij fouten of negatieve getallen wordt een duidelijke foutmelding gegeven.
- Alternatief: opnieuw invoer vragen of standaardwaarden toewijzen.
### Mogelijke uitbreidingen:
- **Herhaald vragen om correcte invoer** totdat geldige gegevens worden ingevoerd.
- **Gebruik van GUI** (bijvoorbeeld Tkinter) voor een gebruiksvriendelijkere interface.
- **Opslaan van gegevens** in een database of bestand.
- **Validatie van andere gegevens** zoals telefoonnummer, postcode, etc.
- **Gebruik van externe libraries** voor meer geavanceerde validaties, zoals `email_validator` voor e-mails.
Wil je dat ik het script verder uitbreid met herhaalde invoer of andere functies?
provider: deepseek
model: deepseek-chat
Absoluut, hier is een Python script dat voldoet aan je eisen, gevolgd door een uitleg en suggesties voor uitbreidingen.
### Python Script
```python
import re
from datetime import datetime
class ValidatieFout(Exception):
"""Aangepaste exceptie voor validatiefouten"""
pass
def valideer_email(email):
"""
Valideert een e-mailadres met een regex patroon.
Gooit een ValidatieFout bij ongeldig formaat.
"""
# Basis maar effectief regex patroon voor e-mailvalidatie
patroon = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
if not re.match(patroon, email):
raise ValidatieFout(f"Ongeldig e-mailformaat: '{email}'. Voer een geldig e-mailadres in (bijv. naam@domein.nl).")
return True
def valideer_leeftijd(leeftijd_str):
"""
Valideert of de invoer een positief geheel getal is.
Gooit een ValidatieFout bij ongeldige invoer.
"""
try:
leeftijd = int(leeftijd_str)
except ValueError:
raise ValidatieFout(f"Ongeldige leeftijd: '{leeftijd_str}'. Voer een geldig geheel getal in.")
if leeftijd <= 0:
raise ValidatieFout(f"Ongeldige leeftijd: {leeftijd}. Leeftijd moet een positief getal zijn.")
return leeftijd
def hoofd_validatie():
"""
Hoofdfunctie die de gebruikersinvoer vraagt en valideert.
Handelt fouten af met duidelijke meldingen en stelt alternatieve acties voor.
"""
print("=== Gegevensvalidatie ===")
# Valideer e-mail
while True:
email = input("Voer uw e-mailadres in: ").strip()
try:
valideer_email(email)
break # Stop de loop als validatie slaagt
except ValidatieFout as e:
print(f"Fout: {e}")
print("Tip: Controleer op typfouten of probeer een ander e-mailadres.\n")
# Valideer leeftijd
while True:
leeftijd_invoer = input("Voer uw leeftijd in: ").strip()
try:
leeftijd = valideer_leeftijd(leeftijd_invoer)
break # Stop de loop als validatie slaagt
except ValidatieFout as e:
print(f"Fout: {e}")
print("Tip: Voer een getal in zonder decimalen (bijv. 25).\n")
# Succesmelding bij geldige gegevens
print(f"\n✅ Validatie geslaagd!")
print(f" E-mail: {email}")
print(f" Leeftijd: {leeftijd}")
# Alternatieve actie: gegevens opslaan of verwerken
# (hier kun je de geldige gegevens naar een database, bestand, etc. sturen)
return {"email": email, "leeftijd": leeftijd}
if __name__ == "__main__":
try:
geldige_gegevens = hoofd_validatie()
# Hier kunnen verdere acties met de geldige gegevens plaatsvinden
# bijv. opslaan_in_database(geldige_gegevens)
except KeyboardInterrupt:
print("\n\nOperatie door gebruiker afgebroken.")
except Exception as e:
print(f"\n❌ Onverwachte fout opgetreden: {e}")
```
### Uitleg Validatie en Foutafhandeling
**1. Validatiemechanisme:**
- **E-mail:** gebruikt een regex patroon om de basisstructuur (lokaal@domein.extensie) te controleren
- **Leeftijd:** converteert naar integer en checkt of het resultaat > 0 is
**2. Foutafhandeling:**
- **Aangepaste exceptie:** `ValidatieFout` voor voorspelbare validatiefouten
- **Try-except blokken:** vangen specifieke fouten en geven contextuele feedback
- **While-loops:** gebruiker blijft proberen tot geldige invoer
- **Duidelijke meldingen:** specifieke foutoorzaak + suggesties voor correctie
- **Graceful afhandeling:** afvangt onverwachte fouten zoals KeyboardInterrupt
**3. Alternatieve Acties:**
- Gebruiker krijgt directe feedback en kan invoer corrigeren
- Bij succesvolle validatie kunnen gegevens worden doorgegeven voor verdere verwerking
### Voorbeelden van Mogelijke Uitbreidingen
```python
# 1. Uitgebreidere e-mailvalidatie met DNS-check
import dns.resolver
def valideer_email_dns(email):
domein = email.split('@')[-1]
try:
dns.resolver.resolve(domein, 'MX')
return True
except:
raise ValidatieFout(f"E-maildomein '{domein}' lijkt niet te bestaan.")
# 2. Leeftijdsrange restricties
def valideer_leeftijd_range(leeftijd, min=13, max=120):
if not min <= leeftijd <= max:
raise ValidatieFout(f"Leeftijd moet tussen {min} en {max} jaar zijn.")
return leeftijd
# 3. Gegevens persistentie
def opslaan_in_bestand(gegevens, bestandsnaam="gebruikers.txt"):
with open(bestandsnaam, "a") as bestand:
bestand.write(f"{datetime.now()}: {gegevens}\n")
# 4. Meerdere validatieregels combineren
def valideer_gebruikersnaam(gebruikersnaam):
if len(gebruikersnaam) < 3:
raise ValidatieFout("Gebruikersnaam moet minstens 3 tekens bevatten.")
if not gebruikersnaam.isalnum():
raise ValidatieFout("Gebruikersnaam mag alleen letters en cijfers bevatten.")
# 5. Internationalisatie (i18n)
foutmeldingen = {
"en": {"email_fout": "Invalid email format"},
"nl": {"email_fout": "Ongeldig e-mailformaat"}
}
# Gebruik: raise ValidatieFout(foutmeldingen[taal]["email_fout"])
```
### Gebruiksvoorbeeld:
```
=== Gegevensvalidatie ===
Voer uw e-mailadres in: janexample.com
Fout: Ongeldig e-mailformaat: 'janexample.com'. Voer een geldig e-mailadres in (bijv. naam@domein.nl).
Tip: Controleer op typfouten of probeer een ander e-mailadres.
Voer uw e-mailadres in: jan@example.nl
Voer uw leeftijd in: -5
Fout: Ongeldige leeftijd: -5. Leeftijd moet een positief getal zijn.
Tip: Voer een getal in zonder decimalen (bijv. 25).
Voer uw leeftijd in: 25
✅ Validatie geslaagd!
E-mail: jan@example.nl
Leeftijd: 25
```
Dit script biedt een robuuste basis die eenvoudig is uit te breiden met extra validatieregels en functionaliteit.