Η δομή try-except είναι ένα σημαντικό χαρακτηριστικό της Python που χρησιμοποιείται για την αναγνώριση και την αντιμετώπιση σφαλμάτων στον κώδικα. Αναλαμβάνει την εκτέλεση μιας σειράς εντολών και σε περίπτωση εμφάνισης σφάλματος, αναλαμβάνει τη διαχείριση αυτού του σφάλματος.
Μπορείτε να χρησιμοποιήσετε τη δομή try-except στον κώδικά σας ως εξής:
try: # Κώδικας που προκαλεί σφάλμα except: # Κώδικας που εκτελείται σε περίπτωση σφάλματος else: # Κώδικας που εκτελείται αν δεν υπάρχει σφάλμα finally: # Κώδικας που εκτελείται πάντα, ακόμα και αν υπάρχει σφάλμα
Στο παραπάνω παράδειγμα, ο κώδικας που μπορεί να προκαλέσει σφάλματα περιλαμβάνεται στη δομή try. Αν η εκτέλεση του κώδικα προκαλέσει κάποιο σφάλμα, ο κώδικας που βρίσκεται στη δομή except εκτελείται. Αν δεν υπάρχει σφάλμα, ο κώδικας που βρίσκεται στη δομή else εκτελείται. Τέλος, ο κώδικας που βρίσκεται στη δομή finally εκτελείται ανεξαρτήτως του αν υπάρχει σφάλμα
Μπορείτε επίσης να χρησιμοποιήσετε τη δομή try-except με συγκεκριμένα μηνύματα σφάλματος, που μπορούν να εμφανιστούν όταν προκύψει σφάλμα. Για παράδειγμα:
try: # Κώδικας που προκαλεί σφάλμα except ValueError: # Κώδικας που εκτελείται αν το σφάλμα είναι ValueError except ZeroDivisionError: # Κώδικας που εκτελείται αν το σφάλμα είναι ZeroDivisionError
Στο παραπάνω παράδειγμα, δύο επιλογές except προσδιορίζουν τα σφάλματα ValueError και ZeroDivisionError αντίστοιχα.
Η δομή try-except μπορεί να χρησιμοποιηθεί για τη διαχείριση σφαλμάτων σε κάθε είδους κώδικα, από απλές εφαρμογές μέχρι πιο πολύπλοκα συστήματα.
Χειρισμός Εξαιρέσεων
Όταν συμβεί ένα σφάλμα, ή εξαίρεση όπως το αποκαλούμε, η Python συνήθως σταματά και δημιουργεί ένα μήνυμα σφάλματος.
Αυτές οι εξαιρέσεις μπορούν να χειριστούν με τη χρήση της δήλωσης try:
Παραδείγματα:
[adinserter block=”2″]
Παράδειγμα 1: Χρήση της δήλωσης try-except για τον χειρισμό μιας εξαίρεσης TypeError
try: x = 10 / 'a' except TypeError: print('An error occurred of type (TypeError).')
Παράδειγμα 2: Χρήση της δήλωσης try-except-finally για τον χειρισμό μιας εξαίρεσης FileNotFoundError κατά την ανάγνωση ενός αρχείου και κλείσιμο του αρχείου με το finally block
try: file = open('example.txt', 'r') file_content = file.read() print(file_content) except FileNotFoundError: print('The file was not found.') finally: file.close()
Στο δεύτερο παράδειγμα, εάν δεν υπάρχει το αρχείο “example.txt”, η εξαίρεση FileNotFoundError θα πιαστεί από τη δήλωση except και θα εκτελεστεί το σχετικό μήνυμα στα αγγλικά. Στο τέλος, το αρχείο θα κλείσει ανεξάρτητα από το εάν συνέβη εξαίρεση ή όχι, χάρη στο finally block.
Μπορείτε να ορίσετε όσα blocks εξαιρέσεων θέλετε, για παράδειγμα αν θέλετε να εκτελέσετε ένα ειδικό block κώδικα για ένα ειδικό είδος σφάλματος:
Παράδειγμα Εκτυπώστε ένα μήνυμα εάν το try block προκαλεί μια NameError και ένα άλλο για άλλα σφάλματα:
try: print(x) except NameError: print("The variable x is not defined.") except: print("Something went wrong while executing the code.")
Στο παραπάνω παράδειγμα, εάν η μεταβλητή x δεν έχει οριστεί, η εξαίρεση NameError θα πιαστεί από την πρώτη δήλωση except και θα εκτυπωθεί το σχετικό μήνυμα στα αγγλικά. Εάν προκύψει οποιοδήποτε άλλο σφάλμα, η δεύτερη δήλωση except θα πιάσει την εξαίρεση και θα εκτυπωθεί το αντίστοιχο μήνυμα στα αγγλικά.
Μπορείτε να χρησιμοποιήσετε τη λέξη-κλειδί else για να ορίσετε ένα block κώδικα που θα εκτελείται εάν δεν προκληθούν σφάλματα:
Παράδειγμα
Σε αυτό το παράδειγμα, το try block δεν προκαλεί κανένα σφάλμα:
try: print("Hello World") except: print("Something went wrong") else: print("Nothing went wrong")
Στο παραπάνω παράδειγμα, εάν δεν προκύψει καμία εξαίρεση κατά τη διάρκεια της εκτέλεσης του try block, το block του else θα εκτελεστεί και θα εκτυπωθεί το αντίστοιχο μήνυμα.
Το block του finally, αν καθοριστεί, θα εκτελεστεί ανεξάρτητα από το εάν το try block προκαλεί σφάλμα ή όχι.
[adinserter block=”3″]
Παράδειγμα:
try: print(x) except: print("Something went wrong") finally: print("The 'try except' block is finished")
Στο παραπάνω παράδειγμα, αν η μεταβλητή x δεν έχει οριστεί, το μήνυμα “Something went wrong” θα εκτυπωθεί. Ωστόσο, ανεξάρτητα από το εάν προκύψει εξαίρεση ή όχι, το block του finally θα εκτελεστεί και θα εκτυπωθεί το αντίστοιχο μήνυμα.
Αυτό μπορεί να είναι χρήσιμο για το κλείσιμο αντικειμένων και τον καθαρισμό των πόρων:
Παράδειγμα:
Προσπαθήστε να ανοίξετε και να γράψετε σε ένα αρχείο που δεν είναι εγγράψιμο:
try: file = open("myfile.txt") file.write("Hello World!") except: print("Something went wrong when writing to the file") finally: file.close()
Στο παραπάνω παράδειγμα, το αρχείο “myfile.txt” ανοίγει για ανάγνωση. Επειδή δεν καθορίζεται η διαμόρφωση του ανοίγματος (mode) στη συνάρτηση open(), το αρχείο ανοίγει αυτόματα σε κατάσταση ανάγνωσης. Ως αποτέλεσμα, η προσπάθεια εγγραφής στο αρχείο θα προκαλέσει μια εξαίρεση, η οποία θα πιαστεί από τη δήλωση except. Τέλος, το αρχείο θα κλείσει ανεξάρτητα από το εάν προκύψει εξαίρεση ή όχι, χάρη στο finally block.
Ως προγραμματιστής Python μπορείτε να επιλέξετε να προκαλέσετε μια εξαίρεση αν προκύψει μια συγκεκριμένη συνθήκη.
Για να προκαλέσετε μια εξαίρεση, χρησιμοποιήστε τη λέξη-κλειδί raise.
Παράδειγμα
Προκαλέστε ένα σφάλμα και σταματήστε το πρόγραμμα αν η μεταβλητή x είναι μικρότερη από 0:
x = -1 if x < 0: raise Exception("x cannot be less than 0")
Στο παραπάνω παράδειγμα, η συνθήκη if ελέγχει εάν η μεταβλητή x είναι μικρότερη από το 0. Αν αυτό είναι αληθές, τότε η εξαίρεση Exception θα προκληθεί και θα εμφανιστεί το αντίστοιχο μήνυμα στα αγγλικά.
Η λέξη-κλειδί raise χρησιμοποιείται για να προκαλέσει μια εξαίρεση.
Μπορείτε να ορίσετε ποιο είδος σφάλματος να προκαλέσετε και το κείμενο που θα εμφανίζεται στον χρήστη.
Παράδειγμα
Προκαλέστε ένα σφάλμα TypeError αν η μεταβλητή x δεν είναι ακέραιος:
x = "hello" if not isinstance(x, int): raise TypeError("x must be an integer")
Στο παραπάνω παράδειγμα, η συνθήκη if ελέγχει εάν η μεταβλητή x είναι ακέραιος. Εάν αυτό δεν ισχύει, τότε η εξαίρεση TypeError θα προκληθεί και θα εμφανιστεί το αντίστοιχο μήνυμα στα αγγλικά.