Χειρισμός σφαλμάτων Python: δοκιμάστε / εκτός από / αλλιώς / τελικά το 2026
Ο χειρισμός σφαλμάτων διαχωρίζει τον "κώδικα που λειτουργεί στο μηχάνημά σας" από τον "κώδικα που επιβιώνει από την παραγωγή". Το «δοκιμάστε / εκτός» της Python φαίνεται απλό, αλλά η πλήρης μορφή τεσσάρων λέξεων-κλειδιών — «δοκιμάστε / εκτός / αλλιώς / τελικά» — κωδικοποιεί έναν εκπληκτικό όγκο δομής που παραλείπουν τα περισσότερα μαθήματα.
Αυτός ο οδηγός καλύπτει: τι σημαίνει στην πραγματικότητα κάθε λέξη-κλειδί, τα έξι μοτίβα που θα βλέπετε σε κάθε βάση κώδικα υποστήριξης, πότε πρέπει να ορίσετε τις δικές σας εξαιρέσεις και τα τρία αντι-μοτίβα που αφήνουν τα σφάλματα να ξεπεράσουν τις δοκιμές σας.
Οι τέσσερις λέξεις-κλειδιά, ακριβώς
Η ρήτρα «άλλο» χρησιμοποιείται ελάχιστα. Λέει "αυτό το επόμενο κομμάτι εξαρτάται από την επιτυχία της προσπάθειας, αλλά δεν θέλω να προστατεύεται από το ίδιο παρά μόνο". Είναι το σωστό μέρος για τη συνέχιση της ευτυχισμένης διαδρομής — αν το βάλετε μέσα στο "try" εντοπίζονται κατά λάθος άσχετες εξαιρέσεις από το "ship(result)".
Τα έξι μοτίβα
1. Δοκιμάστε ξανά σε παροδική αποτυχία
Κανόνας: δοκιμάστε ξανά ΜΟΝΟ σε παροδικά σφάλματα (δίκτυο, χρονικό όριο λήξης, 429, 503). Ποτέ μην επαναλάβετε τα «ValueError», «KeyError», «TypeError» — αυτά είναι σφάλματα κώδικα και η επανάληψη απλώς εκτελεί το σφάλμα τρεις φορές.
2. Φύλαξε με «άλλο».
Το "άλλο" εγγυάται ότι το "αρχείο" άνοιξε με επιτυχία ΚΑΙ εκκαθαρίζει τα πεδία με "με". Σημείωση: Το "process()" μπορεί να αυξήσει το "ValueError" — αυτό θα διαδοθεί, ΔΕΝ θα συλληφθεί από το "εκτός από το FileNotFoundError".
3. Εκκαθάριση με «τελικά» (πριν υπήρχε το «με»)
Στον σύγχρονο κώδικα θα χρησιμοποιούσατε το «with db.connect() ως conn:» — «με» είναι το σάκχαρο πάνω από το «δοκιμάστε / τελικά» για την κοινή περίπτωση καθαρισμού. Προσεγγίστε το ρητό «τελικά» μόνο όταν ο πόρος δεν υποστηρίζει το πρωτόκολλο διαχείρισης περιβάλλοντος.
4. Εκ νέου αύξηση με πρόσθετο περιβάλλον
Το raise NewException(...) από το e ενώνει την αρχική εξαίρεση στη νέα, ώστε το traceback να δείχνει ΚΑΙ ΤΑ ΔΥΟ. Ποτέ μην γράφετε "raise NewException(str(e))" — που απορρίπτει το αρχικό traceback.
5. Πιάστε τη στενότερη εξαίρεση που μπορείτε
Κανόνας: όσο στενότερο το εκτός, τόσο το καλύτερο. Εάν δεν ξέρετε τι μπορεί να προκαλέσει η «διαδικασία», εκτελέστε την και μάθετε. Το "εκτός Εξαίρεσης:" είναι μια μυρωδιά κωδικού στο 90% των περιπτώσεων.
6. «ανύψωση» μέσα στο «εκτός» — σηκώστε ξανά καθαρά
Το γυμνό «raise» διατηρεί ανέπαφο το αρχικό traceback. Ποτέ μην κάνετε "raise e" (η Python 3 είναι έξυπνη γι' αυτό, αλλά το γυμνό "raise" είναι η ιδιωματική μορφή).
Προσαρμοσμένες εξαιρέσεις — όταν αξίζει τον κόπο
Ορίστε τη δική σας τάξη εξαίρεσης όταν:
1. Οι καλούντες πρέπει να "εκτός από το MyError:" συγκεκριμένα (δηλαδή, έχετε ένα καλούμενο API και οι χρήστες πρέπει να διακλαδώσουν ανάλογα με τον τύπο αποτυχίας).
2. Η βιβλιοθήκη/η υπηρεσία σας δημιουργεί πολλά σχετικά σφάλματα που μοιράζονται το περιβάλλον.
Τώρα οι καλούντες μπορούν να συλλάβουν ευρέως («εκτός Σφάλμα πληρωμής») ή στενά («εκτός από το Σφάλμα Απόρριψης Κάρτας»). Τα δομημένα χαρακτηριστικά στην εξαίρεση (e.card_last4) επιτρέπουν στους χειριστές σφαλμάτων να δημιουργούν χρήσιμο UX χωρίς να αναλύουν μηνύματα εξαίρεσης.
Αντί-μοτίβο: που ορίζει μια προσαρμοσμένη εξαίρεση που υπάρχει μόνο για να ανέβει μία φορά και να μην συλληφθεί ποτέ. Αυτό είναι απλώς "αύξηση τιμήςError("...")". Οι προσαρμοσμένες εξαιρέσεις κερδίζουν το βάρος τους από την σύλληψη.
Τρία αντι-μοτίβα που κρύβουν σφάλματα
Αντι-μοτίβο 1: Γυμνό εκτός
Το γυμνό «εκτός» συλλαμβάνει σήματα που πρέπει να βγουν από το πρόγραμμα (Ctrl-C, «sys.exit», «MemoryError»). Μην το γράφετε ποτέ αυτό. Εάν θέλετε πραγματικά να συλλάβετε κάθε μη μοιραία εξαίρεση, χρησιμοποιήστε το "εκτός Εξαίρεσης:" — το οποίο ΑΚΟΜΑ πιάνει πάρα πολύ, αλλά τουλάχιστον σέβεται το Ctrl-C.
Αντι-μοτίβο 2: Σίγαση χωρίς καταγραφή
Κάθε εξαίρεση που συλλαμβάνεται θα πρέπει είτε να αντιμετωπίζεται (με συγκεκριμένο εναλλακτικό) είτε να καταγράφεται. Το "pass" σε ένα εκτός είναι ένα σφάλμα σε αργή κίνηση — ο κώδικας φαίνεται να λειτουργεί ενώ απορρίπτει αθόρυβα δεδομένα.
Αντι-μοτίβο 3: «εκτός Εξαίρεσης:» γύρω από τα πάντα
Πρόβλημα: εάν η "stripe.charge" ήταν επιτυχής αλλά η "send_receipt" απέτυχε, ο πελάτης χρεώθηκε ΚΑΙ καταπιήσατε το σφάλμα. Το «εκτός» καλύπτει τέσσερις διαφορετικές λειτουργίες αποτυχίας και δεν μπορείτε να τις ξεχωρίσετε.
Διόρθωση: περιορίστε το πεδίο δοκιμής + διακλαδώστε το εκτός από το όριο της μονάδας.
Κάθε προσπάθεια καλύπτει ΜΙΑ λειτουργία. Κάθε εκτός ξέρει τι να κάνει για ΑΥΤΗ τη συγκεκριμένη αποτυχία. Αυτός είναι ο χειρισμός σφαλμάτων ποιότητας παραγωγής.
Ο καλός χειρισμός σφαλμάτων είναι περισσότερο σχεδιασμός παρά σύνταξη. Το "try / εκτός από / άλλο / τελικά" σας δίνει τα εργαλεία. η πειθαρχία επιλέγει το σωστό εκτός από τον τύπο, το στενότερο δυνατό πεδίο δοκιμής και ποτέ να μην αποσιωπά τα σφάλματα που δεν καταλαβαίνετε.
Επόμενο βήμα: το Foundations track έχει 10 μαθήματα σχετικά με τον χειρισμό εξαιρέσεων, προσαρμοσμένες εξαιρέσεις και τη δήλωση «με» — με την πραγματική Python να εκτελείται στο πρόγραμμα περιήγησής σας.