Σε αυτό το σεμινάριο, θα μάθετε πώς να χειρίζεστε εξαιρέσεις στο πρόγραμμα Python χρησιμοποιώντας δοκιμές, εκτός και τέλος δηλώσεις με τη βοήθεια παραδειγμάτων.
Βίντεο: Python Exception Handling (δοκιμάστε… εκτός… τελικά)
Εξαιρέσεις στην Python
Η Python έχει πολλές ενσωματωμένες εξαιρέσεις που προκύπτουν όταν το πρόγραμμά σας αντιμετωπίζει σφάλμα (κάτι στο πρόγραμμα πάει στραβά).
Όταν συμβαίνουν αυτές οι εξαιρέσεις, ο διερμηνέας Python σταματά την τρέχουσα διαδικασία και τη μεταδίδει στη διαδικασία κλήσης έως ότου αντιμετωπιστεί. Εάν δεν αντιμετωπιστεί, το πρόγραμμα θα διακοπεί.
Για παράδειγμα, ας εξετάσουμε ένα πρόγραμμα όπου έχουμε μια συνάρτηση A
που καλεί τη λειτουργία B
, η οποία με τη σειρά της λειτουργεί C
. Εάν μια εξαίρεση εμφανίζεται στη λειτουργία, C
αλλά δεν αντιμετωπίζεται C
, η εξαίρεση περνά στο B
και μετά στο A
.
Εάν δεν αντιμετωπιστεί ποτέ, εμφανίζεται ένα μήνυμα σφάλματος και το πρόγραμμά μας διακόπτεται ξαφνικά.
Εξαιρέσεις στο Python
Στο Python, οι εξαιρέσεις μπορούν να αντιμετωπιστούν χρησιμοποιώντας μια try
δήλωση.
Η κρίσιμη λειτουργία που μπορεί να δημιουργήσει μια εξαίρεση τοποθετείται μέσα στον try
όρο. Ο κωδικός που χειρίζεται τις εξαιρέσεις γράφεται στην except
ενότητα.
Μπορούμε λοιπόν να επιλέξουμε ποιες λειτουργίες θα εκτελέσουμε μόλις καταλάβουμε την εξαίρεση. Εδώ είναι ένα απλό παράδειγμα.
# import module sys to get the type of exception import sys randomList = ('a', 0, 2) for entry in randomList: try: print("The entry is", entry) r = 1/int(entry) break except: print("Oops!", sys.exc_info()(0), "occurred.") print("Next entry.") print() print("The reciprocal of", entry, "is", r)
Παραγωγή
Η καταχώρηση είναι Ωχ! συνέβη. Επόμενη καταχώριση. Η καταχώρηση είναι 0 Ωχ! συνέβη. Επόμενη καταχώριση. Η καταχώρηση είναι 2 Η αμοιβαία τιμή 2 είναι 0,5
Σε αυτό το πρόγραμμα, περνάμε τις τιμές της λίστας randomList. Όπως αναφέρθηκε προηγουμένως, το τμήμα που μπορεί να προκαλέσει εξαίρεση τοποθετείται μέσα στο try
μπλοκ.
Εάν δεν υπάρξει εξαίρεση, το except
μπλοκ παραλείπεται και η κανονική ροή συνεχίζεται (για την τελευταία τιμή). Αλλά αν προκύψει οποιαδήποτε εξαίρεση, θα παγιδευτεί από το except
μπλοκ (πρώτη και δεύτερη τιμή).
Εδώ, εκτυπώνουμε το όνομα της εξαίρεσης χρησιμοποιώντας τη exc_info()
λειτουργία μέσα στην sys
ενότητα. Μπορούμε να δούμε ότι τα a
αίτια ValueError
και τα 0
αίτια ZeroDivisionError
.
Δεδομένου ότι κάθε εξαίρεση στο Python κληρονομείται από την βασική Exception
τάξη, μπορούμε επίσης να εκτελέσουμε την παραπάνω εργασία με τον ακόλουθο τρόπο:
# import module sys to get the type of exception import sys randomList = ('a', 0, 2) for entry in randomList: try: print("The entry is", entry) r = 1/int(entry) break except Exception as e: print("Oops!", e.__class__, "occurred.") print("Next entry.") print() print("The reciprocal of", entry, "is", r)
Αυτό το πρόγραμμα έχει την ίδια έξοδο με το παραπάνω πρόγραμμα.
Σύλληψη ειδικών εξαιρέσεων στο Python
Στο παραπάνω παράδειγμα, δεν αναφέραμε καμία συγκεκριμένη εξαίρεση στην except
ενότητα.
Αυτή δεν είναι μια καλή πρακτική προγραμματισμού, καθώς θα καλύψει όλες τις εξαιρέσεις και θα χειριστεί κάθε περίπτωση με τον ίδιο τρόπο. Μπορούμε να καθορίσουμε ποιες εξαιρέσεις except
πρέπει να λαμβάνει ένας όρος.
Μια try
ρήτρα μπορεί να έχει οποιονδήποτε αριθμό except
ρητρών για τον χειρισμό διαφορετικών εξαιρέσεων, ωστόσο, μόνο μία θα εκτελεστεί σε περίπτωση που προκύψει εξαίρεση.
Μπορούμε να χρησιμοποιήσουμε μια πλειάδα τιμών για να καθορίσουμε πολλαπλές εξαιρέσεις σε μια ρήτρα εκτός. Εδώ είναι ένα παράδειγμα ψευδο κώδικα.
try: # do something pass except ValueError: # handle ValueError exception pass except (TypeError, ZeroDivisionError): # handle multiple exceptions # TypeError and ZeroDivisionError pass except: # handle all other exceptions pass
Αύξηση εξαιρέσεων στο Python
Στον προγραμματισμό Python, δημιουργούνται εξαιρέσεις όταν εμφανίζονται σφάλματα κατά τον χρόνο εκτέλεσης. Μπορούμε επίσης να αυξήσουμε με μη αυτόματο τρόπο εξαιρέσεις χρησιμοποιώντας τη raise
λέξη-κλειδί.
Μπορούμε προαιρετικά να μεταφέρουμε τιμές στην εξαίρεση για να διευκρινίσουμε γιατί δημιουργήθηκε αυτή η εξαίρεση.
>>> raise KeyboardInterrupt Traceback (most recent call last):… KeyboardInterrupt >>> raise MemoryError("This is an argument") Traceback (most recent call last):… MemoryError: This is an argument >>> try:… a = int(input("Enter a positive integer: "))… if a <= 0:… raise ValueError("That is not a positive number!")… except ValueError as ve:… print(ve)… Enter a positive integer: -2 That is not a positive number!
Python δοκιμάστε με άλλη ρήτρα
Σε ορισμένες περιπτώσεις, μπορεί να θέλετε να εκτελέσετε ένα συγκεκριμένο μπλοκ κώδικα εάν το μπλοκ κώδικα στο εσωτερικό try
εκτελέστηκε χωρίς σφάλματα. Για αυτές τις περιπτώσεις, μπορείτε να χρησιμοποιήσετε την προαιρετική else
λέξη-κλειδί με τη try
δήλωση.
Σημείωση : Οι εξαιρέσεις στην άλλη ρήτρα δεν αντιμετωπίζονται από τα προηγούμενα εκτός από τις ρήτρες.
Ας δούμε ένα παράδειγμα:
# program to print the reciprocal of even numbers try: num = int(input("Enter a number: ")) assert num % 2 == 0 except: print("Not an even number!") else: reciprocal = 1/num print(reciprocal)
Παραγωγή
Εάν περάσουμε έναν μονό αριθμό:
Εισαγάγετε έναν αριθμό: 1 Όχι έναν ζυγό αριθμό!
Εάν περάσουμε έναν ζυγό αριθμό, ο αντίστροφος υπολογίζεται και εμφανίζεται.
Πληκτρολογήστε έναν αριθμό: 4 0.25
Ωστόσο, εάν περάσουμε το 0, παίρνουμε ZeroDivisionError
καθώς το μπλοκ κώδικα στο εσωτερικό else
δεν αντιμετωπίζεται από το προηγούμενο except
.
Enter a number: 0 Traceback (most recent call last): File "", line 7, in reciprocal = 1/num ZeroDivisionError: division by zero
Python try… finally
The try
statement in Python can have an optional finally
clause. This clause is executed no matter what, and is generally used to release external resources.
For example, we may be connected to a remote data center through the network or working with a file or a Graphical User Interface (GUI).
In all these circumstances, we must clean up the resource before the program comes to a halt whether it successfully ran or not. These actions (closing a file, GUI or disconnecting from network) are performed in the finally
clause to guarantee the execution.
Here is an example of file operations to illustrate this.
try: f = open("test.txt",encoding = 'utf-8') # perform file operations finally: f.close()
Αυτός ο τύπος κατασκευής διασφαλίζει ότι το αρχείο είναι κλειστό, ακόμη και αν προκύψει εξαίρεση κατά την εκτέλεση του προγράμματος.