Python Exception Handling Χρήση δοκιμής, εκτός και τέλος δήλωσης

Σε αυτό το σεμινάριο, θα μάθετε πώς να χειρίζεστε εξαιρέσεις στο πρόγραμμα 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()

Αυτός ο τύπος κατασκευής διασφαλίζει ότι το αρχείο είναι κλειστό, ακόμη και αν προκύψει εξαίρεση κατά την εκτέλεση του προγράμματος.

ενδιαφέροντα άρθρα...