DedSec Project

ValueError — DedSec Project

ValueError: ξεχώρισε μορφή, εύρος και τύπο Τι συμβαίνει και πότε Το ValueError συνήθως σημαίνει ότι ο τύπος είναι κατάλληλος αλλά η τιμή παραβιάζει έναν κανόνα. Το int('12x') δέχεται string…

ValueError: ξεχώρισε μορφή, εύρος και τύπο

Τι συμβαίνει και πότε

Το ValueError συνήθως σημαίνει ότι ο τύπος είναι κατάλληλος αλλά η τιμή παραβιάζει έναν κανόνα. Το int('12x') δέχεται string ως παράμετρο αλλά όχι αυτήν τη μορφή περιεχομένου. Ένας αριθμός θύρας μπορεί να είναι int και παρ' όλα αυτά άκυρος. Το μήνυμα πρέπει να εντοπίζει το πεδίο χωρίς να αποκαλύπτει ευαίσθητα δεδομένα.

Αυτοτελές εκτελέσιμο παράδειγμα

Αποθήκευσε το παράδειγμα ως 007_ValueError.py και εκτέλεσε python3 007_ValueError.py. Ο έλεγχος καλύπτει τη λανθασμένη είσοδο και τη διορθωμένη περίπτωση.

def parse_port(text):
    try:
        port = int(text, 10)
    except ValueError as exc:
        raise ValueError("port must be a decimal integer") from exc
    if not 1 <= port <= 65535:
        raise ValueError("port outside 1..65535")
    return port
assert parse_port("443") == 443
for invalid in ("abc", "0", "65536"):
    try:
        parse_port(invalid)
    except ValueError:
        pass
    else:
        raise AssertionError(invalid)

Διαγνωστική διαδικασία και ασφαλής διόρθωση

Ξεχώρισε parsing και σημασιολογικό έλεγχο: πρώτα αναγνώρισε τη μορφή, μετά έλεγξε το επιτρεπτό εύρος. Το except Exception κρύβει και σφάλματα προγραμματισμού· πιάσε ValueError μόνο εκεί όπου μπορείς να το χειριστείς. Καθόρισε ρητά τι συμβαίνει με 0, κενά και πρόσημα.

Πρακτικό εργαστήριο / έλεγχος ορίων

Αποφάσισε αν επιτρέπεται το ' +80 ' και αν πρέπει να απορρίπτεται το '80.0'. Υλοποίησε τον κανόνα χωρίς να αλλάξει το εύρος, με δοκιμές για ελάχιστη, μέγιστη και γειτονικές εκτός ορίων τιμές.

Αυστηρή είσοδος θύρας: πρώτα η μορφή, μετά η μετατροπή

Η int() δέχεται κενά και πρόσημα. Αν το αρχείο ρυθμίσεων ορίζει από ένα έως πέντε ψηφία ASCII, πρέπει να ελέγξεις αυτόν τον κανόνα πριν από τη μετατροπή. Το όριο μήκους αποτρέπει και άσκοπη επεξεργασία τεράστιων εισόδων. Εδώ επιτρέπονται αρχικά μηδενικά μόνο όταν το συνολικό μήκος δεν ξεπερνά τους πέντε χαρακτήρες.

def parse_port(text):
    if not isinstance(text, str):
        raise TypeError('port must be text')
    if len(text) > 5 or not text.isascii() or not text.isdecimal():
        raise ValueError('port must be 1..5 ASCII digits')
    port = int(text)
    if not 1 <= port <= 65535:
        raise ValueError('port outside 1..65535')
    return port

assert parse_port('080') == 80
assert parse_port('65535') == 65535
for bad in ('', '000080', '65536', '80', '-1', ' 80 '):
    try: parse_port(bad)
    except ValueError: pass
    else: raise AssertionError(bad)

Διάγνωση και κριτήριο επάρκειας

Ξεχώρισε τη λανθασμένη μορφή από την τιμή εκτός ορίων. Τα '0' και '65536' παραβιάζουν το εύρος, ενώ τα '80' και ' 80 ' τη μορφή. Μην καταγράφεις ευαίσθητες τιμές ρυθμίσεων στα logs. Ολοκλήρωσε δοκιμές για ακριβή όρια, μη ASCII ψηφία, αρχικά μηδενικά, κενό κείμενο και μη συμβολοσειρές, χωρίς γενικό except που κρύβει άσχετα σφάλματα.