Ontwerp een toepassing voor gegevensvalidatie en foutafhandeling
description
Met deze prompt kun je leren hoe je een toepassing maakt die de integriteit van invoergegevens waarborgt en tegelijkertijd robuuste foutafhandeling implementeert. Dit voorkomt dat fouten de applicatie laten crashen en verbetert de gebruikerservaring. De duidelijke uitleg en voorbeeldcode maken het makkelijker om deze technieken in je eigen projecten toe te passen.
prompt
Help me bij het ontwerpen van een toepassing die gegevensvalidateert en robuuste foutafhandeling uitvoert. Beschrijf hoe ik validatieregels kan opstellen voor de vol ...
try_prompt
generate_helper
disclaimerOnPageApi
tags
ai_answers
provider: openai
model: gpt-4.1-nano
Natuurlijk! Hier is een stapsgewijze gids voor het ontwerpen van een toepassing die gegevens valideert en robuuste foutafhandeling uitvoert, gericht op e-mailadressen en telefoonnummers. Ik geef ook een voorbeeldimplementatie in Python.
**Stap-voor-stap uitleg**
1. **Definieer validatieregels**
- **E-mailadressen:**
- Moeten een geldig formaat hebben: `local-part@domain`
- Gebruik een regex die de meeste geldige e-mailformaten accepteert
- Bijvoorbeeld: minimaal één teken voor `@`, een domeinnaam met punt, en een top-level domein
- **Telefoonnummers:**
- Moeten een geldig formaat hebben (bijvoorbeeld: cijfers, optioneel spaties, koppeltekens, of haakjes)
- Vaak wordt een regex gebruikt om verschillende formaten te accepteren
- Bijvoorbeeld: landcode optioneel, gevolgd door cijfers
2. **Implementatie in Python**
- Maak functies voor validatie
- Gebruik try-except blokken voor foutafhandeling
- Geef duidelijke foutmeldingen bij invaliditeit
3. **Robuuste foutafhandeling**
- Controleer of gegevens correct zijn
- Geef informatieve foutmeldingen
- Zorg dat de applicatie niet crasht door exception handling
4. **Voorbeeld**
Hieronder vind je een voorbeeldimplementatie.
---
**Voorbeeldcode in Python:**
```python
import re
def validate_email(email):
"""
Validatie van een e-mailadres met regex.
"""
email_regex = re.compile(
r"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$"
)
if email_regex.match(email):
return True
else:
raise ValueError(f"Onjuist e-mailadres: {email}")
def validate_telefoonnummer(telefoon):
"""
Validatie van een telefoonnummer.
Accepteert formaten zoals:
- 0612345678
- +31 6 12345678
- +31-6-12345678
- 06-12345678
"""
telefoon_regex = re.compile(
r"^(\+?\d{1,3}[\s-]?)?(\(?\d+\)?[\s-]?)?\d+([\s-]?\d+)*$"
)
if telefoon_regex.match(telefoon):
return True
else:
raise ValueError(f"Onjuist telefoonnummer: {telefoon}")
def main():
gegevens = [
{"email": "voorbeeld@voorbeeld.com", "telefoon": "+31 6 12345678"},
{"email": "foutief@voorbeeld", "telefoon": "06-12-34-56-78"},
{"email": "correct@domein.nl", "telefoon": "0612345678"},
{"email": "ongeldig@@voorbeeld.com", "telefoon": "abc123"},
]
for index, item in enumerate(gegevens):
print(f"\nValideren item {index + 1}:")
try:
if validate_email(item["email"]):
print(f"E-mail '{item['email']}' is geldig.")
except ValueError as e:
print(e)
try:
if validate_telefoonnummer(item["telefoon"]):
print(f"Telefoon '{item['telefoon']}' is geldig.")
except ValueError as e:
print(e)
if __name__ == "__main__":
main()
```
---
**Samenvatting:**
- Definieer regex-patronen voor elke gegevenssoort.
- Maak functies die deze patronen controleren en exception handling gebruiken.
- In de hoofdfunctie validateer je gegevens en behandel je fouten op een informatieve manier.
- Zorg dat je validatie flexibel is, maar ook streng genoeg om onjuiste data te voorkomen.
Wil je verdere hulp bij het aanpassen van deze validatieregels of het uitbreiden van de toepassing?
provider: deepseek
model: deepseek-chat
Ik help je graag bij het ontwerpen van een robuuste validatietoepassing. Hier is een complete uitleg in het Nederlands:
## Validatieregels
**E-mailadressen:**
- Moet een @ bevatten
- Domeinnaam na de @ moet een punt bevatten
- Geen spaties toegestaan
- Speciale tekens voor de @ zijn beperkt (alleen letters, cijfers, ., -, _)
- Domein extensie moet minstens 2 tekens lang zijn
**Telefoonnummers (Nederlands):**
- Begint met +31 of 06 (mobiel) of vaste lijn
- Minimaal 10 cijfers
- Optioneel spaties, streepjes, haakjes
- Landcode +31 of 0
## Stap-voor-stap implementatie
```python
import re
from typing import Dict, List, Optional, Tuple
from dataclasses import dataclass
@dataclass
class ValidatieResultaat:
is_geldig: bool
fouten: List[str]
genormaliseerd: Optional[str] = None
class GegevensValidator:
def __init__(self):
# Regex patronen voor validatie
self.email_pattern = re.compile(
r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
)
self.telefoon_pattern = re.compile(
r'^(\+31|0|0031)[1-9][0-9]{7,8}$'
)
def normaliseer_telefoonnummer(self, telefoon: str) -> str:
"""Verwijder niet-cijferige tekens en normaliseer naar +31 formaat"""
# Verwijder alle niet-cijferige tekens
cijfers = re.sub(r'\D', '', telefoon)
# Normaliseer naar +31 formaat
if cijfers.startswith('0'):
return '+31' + cijfers[1:]
elif cijfers.startswith('0031'):
return '+31' + cijfers[4:]
elif cijfers.startswith('31'):
return '+' + cijfers
else:
return '+' + cijfers
def valideer_email(self, email: str) -> ValidatieResultaat:
"""Valideer en normaliseer e-mailadres"""
fouten = []
# Basis checks
if not email:
fouten.append("E-mailadres mag niet leeg zijn")
return ValidatieResultaat(False, fouten)
email = email.strip().lower()
# Regex validatie
if not self.email_pattern.match(email):
fouten.append("Ongeldig e-mail formaat")
# Extra checks
if '..' in email:
fouten.append("E-mail mag niet twee punten achter elkaar bevatten")
if email.count('@') != 1:
fouten.append("E-mail moet precies één @ bevatten")
return ValidatieResultaat(
is_geldig=len(fouten) == 0,
fouten=fouten,
genormaliseerd=email if len(fouten) == 0 else None
)
def valideer_telefoon(self, telefoon: str) -> ValidatieResultaat:
"""Valideer en normaliseer telefoonnummer"""
fouten = []
if not telefoon:
fouten.append("Telefoonnummer mag niet leeg zijn")
return ValidatieResultaat(False, fouten)
# Normaliseer eerst
genormaliseerd = self.normaliseer_telefoonnummer(telefoon)
# Valideer het genormaliseerde nummer
if not self.telefoon_pattern.match(genormaliseerd):
fouten.append("Ongeldig telefoonnummer formaat")
# Controleer lengte
cijfers = re.sub(r'\D', '', genormaliseerd)
if len(cijfers) < 10:
fouten.append("Telefoonnummer moet minstens 10 cijfers bevatten")
return ValidatieResultaat(
is_geldig=len(fouten) == 0,
fouten=fouten,
genormaliseerd=genormaliseerd if len(fouten) == 0 else None
)
class ValidatieManager:
def __init__(self):
self.validator = GegevensValidator()
def valideer_gegevens(self, gegevens: Dict[str, str]) -> Dict[str, ValidatieResultaat]:
"""Valideer meerdere gegevens in één keer"""
resultaten = {}
if 'email' in gegevens:
resultaten['email'] = self.validator.valideer_email(gegevens['email'])
if 'telefoon' in gegevens:
resultaten['telefoon'] = self.validator.valideer_telefoon(gegevens['telefoon'])
return resultaten
def zijn_alle_gegevens_geldig(self, resultaten: Dict[str, ValidatieResultaat]) -> bool:
"""Controleer of alle validaties succesvol zijn"""
return all(resultaat.is_geldig for resultaat in resultaten.values())
# Voorbeeldgebruik
def toon_voorbeeld():
validator = ValidatieManager()
# Testgegevens
test_gegevens = {
'email': 'voorbeeld@domein.nl',
'telefoon': '06-12345678'
}
print("=== Validatie Voorbeeld ===")
print(f"Input gegevens: {test_gegevens}")
# Voer validatie uit
resultaten = validator.valideer_gegevens(test_gegevens)
# Toon resultaten
for veld, resultaat in resultaten.items():
status = "✓ GELDIG" if resultaat.is_geldig else "✗ ONGELDIG"
print(f"\n{veld.upper()}: {status}")
if resultaat.genormaliseerd:
print(f" Genormaliseerd: {resultaat.genormaliseerd}")
if not resultaat.is_geldig:
print(" Fouten:")
for fout in resultaat.fouten:
print(f" - {fout}")
# Controleer overall status
if validator.zijn_alle_gegevens_geldig(resultaten):
print("\n🎉 Alle gegevens zijn geldig!")
else:
print("\n❌ Er zijn validatiefouten gevonden.")
# Uitgebreide test cases
def test_validatie():
validator = GegevensValidator()
test_cases = [
# E-mail test cases
("test@example.com", "email", True),
("ongeldig@", "email", False),
("geen-at-teken.com", "email", False),
# Telefoon test cases
("0612345678", "telefoon", True),
("+31612345678", "telefoon", True),
("06-12345678", "telefoon", True),
("12345", "telefoon", False),
]
print("\n=== Uitgebreide Test Cases ===")
for invoer, type, verwacht in test_cases:
if type == "email":
resultaat = validator.valideer_email(invoer)
else:
resultaat = validator.valideer_telefoon(invoer)
status = "✓" if resultaat.is_geldig == verwacht else "✗"
print(f"{status} {type}: '{invoer}' -> {resultaat.is_geldig} (verwacht: {verwacht})")
if __name__ == "__main__":
toon_voorbeeld()
test_validatie()
```
## Belangrijke kenmerken van deze implementatie:
1. **Robuuste foutafhandeling** - Duidelijke foutmeldingen per validatiefout
2. **Genormaliseerde output** - Consistent formaat voor geldige gegevens
3. **Uitbreidbaar** - Makkelijk nieuwe validatieregels toe te voegen
4. **Testbaar** - Inclusief test cases voor verschillende scenario's
5. **Type hints** - Betere code kwaliteit en onderhoudbaarheid
Deze aanvolg zorgt voor professionele gegevensvalidatie met duidelijke foutmeldingen en genormaliseerde uitvoer!
error: Generation failed [deepseek] prompt_id=1182 locale=fr err=DeepSeek connection/timeout