Python Try Except: Εξηγείται με Παραδείγματα

Το Python Try Except είναι μια κατασκευή που χρησιμοποιείται στην Python για να χειρίζεται τις εξαιρέσεις με χάρη χωρίς να κολλάει.
Ο χειρισμός εξαιρέσεων καθιστά τον κώδικα του προγράμματός σας πιο αξιόπιστο και λιγότερο πιθανό να αποτύχει. Αυτό το άρθρο καθοδηγεί τον χειρισμό εξαιρέσεων και τα κοινά σενάρια στα οποία ο χειρισμός εξαιρέσεων είναι ιδανικός. Ως μπόνους, θα καλύψουμε επίσης τον τρόπο δημιουργίας εξαιρέσεων.
Πίνακας περιεχομένων
Τι είναι ο χειρισμός εξαίρεσης;
Εξαιρέσεις αποτελούν κρίσιμες ανωμαλίες και σφάλματα που προκύπτουν κατά την εκτέλεση ενός προγράμματος. Εάν δεν γίνει χειρισμός, οι εξαιρέσεις θα διακόψουν τη λειτουργία του προγράμματος. Επομένως, ο χειρισμός εξαιρέσεων είναι ένας τρόπος χειρισμού εξαιρέσεων για να διασφαλιστεί ότι δεν θα διακοπεί το πρόγραμμα.
Ακολουθεί ένα παράδειγμα για να δείξουμε τι είναι η εξαίρεση.
user_input = input("Enter a number: ") num = int(user_input) print("Your number doubled is:", num * 2)
Με την πρώτη ματιά, φαίνεται ότι δεν υπάρχει τίποτα κακό με το παραπάνω πρόγραμμα. Λαμβάνει δεδομένα από τον χρήστη και τα μετατρέπει σε ακέραιο. Στη συνέχεια, εμφανίζει τον ακέραιο αριθμό που παρέχεται από τον χρήστη διπλασιασμένο.
Το πρόγραμμα εκτελείται κανονικά εάν το εκτελείτε με τιμή εισαγωγής 5. Δείτε παρακάτω.
Ας υποθέσουμε όμως ότι εκτελέσατε ξανά το ίδιο πρόγραμμα. Μόνο που αυτή τη φορά, αντί να χρησιμοποιήσετε το 5 ως είσοδο, εισάγετε τη συμβολοσειρά “γεια”. Το πρόγραμμα θα διακοπεί. Η συμβολοσειρά “hello” δεν μπορεί να μετατραπεί σε ακέραιο, επομένως δημιουργείται μια εξαίρεση και το πρόγραμμα διακόπτεται.
Γιατί εγείρονται εξαιρέσεις και γιατί πρέπει να τις χειριστείτε;
Οι εξαιρέσεις εγείρονται επειδή συχνά αποσυνθέτουμε προγράμματα σε συναρτήσεις κατά την κωδικοποίηση τους. Αυτές οι λειτουργίες στη συνέχεια καλούνται να εκτελέσουν διαφορετικές εργασίες.
Στο παραπάνω παράδειγμα, καλέσαμε τη συνάρτηση εισόδου για να λάβουμε την είσοδο του χρήστη, μετά καλέσαμε τη συνάρτηση int για να μετατρέψουμε την είσοδο συμβολοσειράς σε ακέραιο και, τέλος, καλέσαμε τη συνάρτηση εκτύπωσης για να εμφανίσουμε κάποια έξοδο.
Ωστόσο, καθώς οι λειτουργίες εκτελούν τις ενέργειές τους, ενδέχεται να αντιμετωπίσουν σφάλματα που δεν ξέρουν πώς να χειριστούν. Σε αυτήν την περίπτωση, οι εν λόγω συναρτήσεις πρέπει να σταματήσουν να εκτελούνται και να γνωστοποιήσουν ότι παρουσιάστηκε σφάλμα. Για να επικοινωνήσουν, θα εγείρουν εξαιρέσεις.
Ο κώδικας που ονομάζεται συνάρτηση είναι υπεύθυνος για την ακρόαση αυτών των εξαιρέσεων και την κατάλληλη αντίδραση. Εάν δεν γίνει αυτό, το πρόγραμμα θα διακοπεί αφού συναντήσει σφάλματα, όπως είδαμε στο προηγούμενο παράδειγμα.
Επομένως, οι εξαιρέσεις είναι ουσιαστικά ένας μηχανισμός επικοινωνίας που επιτρέπει σε μια συνάρτηση που έχει κληθεί να στείλει ένα σήμα κινδύνου στον κωδικό που την κάλεσε. Και η αντίδραση που αναφέρθηκε κατάλληλα προηγουμένως είναι η ουσία του χειρισμού εξαιρέσεων.
Διαφορετικά είδη εξαιρέσεων
Είναι σημαντικό να γνωρίζετε ότι δεν είναι όλες οι εξαιρέσεις ίδιες. Υπάρχουν διάφορα είδη εξαιρέσεων που εγείρονται για διαφορετικά σφάλματα που αντιμετωπίζονται. Για παράδειγμα, εάν επιχειρήσετε να διαιρέσετε έναν αριθμό με το μηδέν, εμφανίζεται ένα ZeroDivisionError. Και εμφανίζεται ένα TypeError όταν επιχειρείτε μια λειτουργία με μη έγκυρο τύπο δεδομένων. Εδώ είναι μια πλήρης λίστα με είδη εξαιρέσεων.
Πώς να χειριστείτε τις εξαιρέσεις
Όπως εξηγήθηκε προηγουμένως, εξαιρέσεις είναι σήματα κινδύνου που παράγονται από συναρτήσεις που καλούμε. Επομένως, ο κώδικάς μας θα πρέπει να ακούει αυτά τα σήματα κινδύνου και να αντιδρά κατάλληλα όταν ηχούνται. Για να χειριστούμε σωστά τις εξαιρέσεις, χρησιμοποιούμε κατασκευές Python Try Except. Η βασική δομή για την κατασκευή είναι η εξής:
try: # Code to try and run except: # Code to run if an exception is raised finally: # Code to run in the end, whether or not an exception is raised
Όπως μπορείτε να δείτε, η κατασκευή αποτελείται από τρεις λέξεις-κλειδιά που εξηγούνται παρακάτω:
δοκιμάστε
Η λέξη-κλειδί try σηματοδοτεί την αρχή μιας δομής Python Try Except. Επιπλέον, επισημαίνει ένα μπλοκ κώδικα που θα μπορούσε ενδεχομένως να δημιουργήσει μια εξαίρεση. Είναι μια οδηγία προς τον διερμηνέα Python να προσπαθήσει να εκτελέσει κώδικα στο μπλοκ. Εάν εγείρεται μια εξαίρεση, το πρόγραμμα σταματά αμέσως και μεταβαίνει για να εκτελέσει τον κώδικα που είναι γραμμένος μέσα στο μπλοκ εκτός.
εκτός
Η λέξη-κλειδί εκτός σηματοδοτεί το μπλοκ κώδικα που θα εκτελεστεί εάν προκύψει εξαίρεση κατά την εκτέλεση του μπλοκ δοκιμής. Μπορείτε να ορίσετε πολλαπλά μπλοκ εκτός για διαφορετικούς τύπους εξαιρέσεων που θα μπορούσαν να αυξηθούν. Αυτό θα επεξηγηθεί αργότερα.
τελικά
Η τελευταία λέξη-κλειδί είναι η τρίτη και τελευταία λέξη-κλειδί που χρησιμοποιείται στο Python Try Except. Σηματοδοτεί ένα μπλοκ κώδικα που θα εκτελεστεί ανεξάρτητα από το αν υπάρχει εξαίρεση ή όχι.
Ενα παράδειγμα
Ακολουθεί ένα παράδειγμα του τρόπου με τον οποίο οι παραπάνω λέξεις-κλειδιά μπορούν να χειριστούν μια εξαίρεση. Θα τροποποιήσουμε το προηγούμενο παράδειγμα σε αυτό.
try: user_input = input("Enter a number: ") num = int(user_input) print("Your number doubled is:", num * 2) except: print("Something went wrong") finally: print("This code will be executed no matter what")
Εάν εκτελέσετε τον παραπάνω κωδικό με 5, μια έγκυρη είσοδο, ως είσοδο, θα λάβετε τα εξής:
Και αν το εκτελέσετε με “γεια” ως είσοδο, θα λάβετε τα εξής:
Έτσι, όταν δεν έγινε εξαίρεση κατά την εκτέλεση του κώδικα στο μπλοκ δοκιμής, ο υπολογιστής προχώρησε στο τελικό μπλοκ. Ωστόσο, όταν τέθηκε μια εξαίρεση κατά την εκτέλεση του κώδικα στο μπλοκ δοκιμής, ο υπολογιστής μετακινήθηκε στο μπλοκ εκτός και, στη συνέχεια, στο μπλοκ τελικά.
Μπορείτε επίσης να χειριστείτε εξαιρέσεις για συγκεκριμένα είδη σφαλμάτων. Για παράδειγμα, εάν θέλετε να χειριστείτε τις εξαιρέσεις ValueError και KeyboardInterrupt με συγκεκριμένο τρόπο, μπορείτε να τροποποιήσετε τον παραπάνω κώδικα ως εξής:
try: user_input = input("Enter a number: ") num = int(user_input) print("Your number doubled is:", num * 2) except ValueError: print("Value can't be converted to int") except KeyboardInterrupt: print("Received a keyboard interrupt") except: print("Catch-all exception block") finally: print("This code will be executed no matter what")
Στον παραπάνω κώδικα, έχουμε 3 εκτός από μπλοκ. Το πρώτο εκτός του αποκλεισμού πιάνει μόνο τις εξαιρέσεις ValueError, ενώ το δεύτερο μόνο τις εξαιρέσεις KeyboardInterrupt. Το μπλοκ τελευταίο εκτός δεν έχει συσχετισμένο τύπο εξαίρεσης για ακρόαση. Ως αποτέλεσμα, πιάνει τις υπόλοιπες εξαιρέσεις που δεν καλύπτονται από τα δύο πρώτα μπλοκ.
Εκτελώντας τον παραπάνω κώδικα, θα πρέπει να λάβετε μια έξοδο παρόμοια με αυτήν:
Όταν τίθεται μια εξαίρεση, μπορείτε να λάβετε περισσότερες πληροφορίες σχετικά με την εξαίρεση στο αντικείμενο εξαίρεσης. Για να αποκτήσετε πρόσβαση στο αντικείμενο εξαίρεσης, χρησιμοποιείτε τη λέξη-κλειδί ως. Χρησιμοποιείται ως εξής:
try: user_input = input("Enter a number: ") num = int(user_input) print("Your number doubled is:", num * 2) except ValueError as e: print("Value Error:", e) except KeyboardInterrupt as e: print("Keyboard Interrupt:", e) except Exception as e: print("Some other exception", e)
Πώς να δημιουργήσετε εξαιρέσεις
Μέχρι τώρα, είχαμε να κάνουμε με εξαιρέσεις που εγείρονται από άλλες λειτουργίες. Ωστόσο, είναι επίσης δυνατό να δημιουργήσετε εξαιρέσεις στον κώδικά σας. Για να δημιουργήσουμε μια εξαίρεση, χρησιμοποιούμε τη λέξη-κλειδί αύξησης. Καθορίζουμε επίσης μια κλάση που αντιπροσωπεύει τον τύπο εξαίρεσης που θέλουμε να δημιουργήσουμε και το αναγνώσιμο από τον άνθρωπο μήνυμα που σχετίζεται με την εξαίρεση.
Χρησιμοποιούμε την κλάση Exception στο ακόλουθο παράδειγμα για να δημιουργήσουμε μια γενική εξαίρεση. Στη συνέχεια, περνάμε το μήνυμα στον κατασκευαστή της κλάσης.
raise Exception('Something went wrong')
Εάν εκτελέσετε το παραπάνω απόσπασμα ως πρόγραμμα, θα λάβετε έξοδο παρόμοια με αυτό:
Μπορείτε επίσης να καθορίσετε διαφορετικά είδη εξαιρέσεων. Για παράδειγμα, μπορείτε να δημιουργήσετε μια εξαίρεση TypeError όταν μια τιμή έχει λάθος τύπο δεδομένων:
def double(x): if isinstance(x, int): return x * 2 else raise TypeError('x should be an int')
Ή εάν η καθορισμένη τιμή είναι εκτός των αποδεκτών ορίων, μπορείτε να αυξήσετε ένα ValueError:
def say_hello(name): if name == '': raise ValueError('Value outside bounds') else: print('Hello', name)
Μπορείτε επίσης να δημιουργήσετε τους τύπους εξαιρέσεών σας υποκατηγορώντας την κλάση Εξαίρεση. Εδώ είναι ένα παράδειγμα:
class InvalidHTTPMethod(Exception): pass
Στο παραπάνω παράδειγμα, δημιουργήσαμε μια κλάση InvalidHTTPMethod, η οποία κληρονομείται από την κλάση Exception. Μπορούμε να το χρησιμοποιήσουμε με τον ίδιο τρόπο όπως πριν για να δημιουργήσουμε εξαιρέσεις:
raise InvalidHTTPMethod('Must be GET or POST')
Κοινές περιπτώσεις χρήσης για χειρισμό εξαιρέσεων
Ο χειρισμός εξαιρέσεων χρησιμοποιείται σε πολλά σενάρια. Το προηγούμενο παράδειγμα έδειξε πώς μπορεί να χειριστεί εξαιρέσεις λόγω εισόδου χρήστη. Αυτή η ενότητα θα καλύψει δύο επιπλέον περιπτώσεις όπου ο χειρισμός εξαιρέσεων είναι χρήσιμος. Πρόκειται για χειρισμό εξαιρέσεων ως αποτέλεσμα αποτυχημένων αιτημάτων δικτύου και χειρισμό εξαιρέσεων κατά την ανάγνωση αρχείων.
Υποβολή αιτημάτων δικτύου
Στο παρακάτω παράδειγμα, υποβάλλουμε ένα αίτημα στην Google. Ακούμε εξαιρέσεις για να τις χειριστούμε. Αυτές οι εξαιρέσεις ορίζονται στο αντικείμενο requests.exceptions.
import requests try: response = requests.get("https://google.com") # Check if the response status code is in the 200-299 range (successful response) if 200 <= response.status_code < 300: print("Request was successful!") else: print(f"Request failed with status code: {response.status_code}") except requests.exceptions.RequestException as e: print(f"RequestException occurred: {e}") except requests.exceptions.ConnectionError as e: print(f"ConnectionError occurred: {e}") except requests.exceptions.Timeout as e: print(f"Timeout occurred: {e}") except requests.exceptions.TooManyRedirects as e: print(f"TooManyRedirects occurred: {e}") except requests.exceptions.HTTPError as e: print(f"HTTPError occurred: {e}") except Exception as e: print(f"An unexpected error occurred: {e}")
Ανάγνωση δεδομένων από αρχείο
Σε αυτό το τελευταίο παράδειγμα, διαβάζουμε δεδομένα από το αρχείο hello.txt. Διαχειριζόμαστε επίσης κοινές εξαιρέσεις που ενδέχεται να προκύψουν, όπως το σφάλμα FileNotFound και το IOError.
try: with open(file_path, 'r') as file: data = file.read() print("File contents:") print(data) except FileNotFoundError as e: print(f"FileNotFoundError occurred: {e}") except IOError as e: print(f"IOError occurred: {e}") except Exception as e: print(f"An unexpected error occurred: {e}")
συμπέρασμα
Αυτό το άρθρο διερεύνησε ποιες ήταν οι εξαιρέσεις και γιατί προέκυψαν. Επίσης, διαπιστώσαμε ότι τα χειριζόμαστε για να κάνουμε τον κώδικα πιο αξιόπιστο και να αποτρέπουμε τη συντριβή. Τέλος, καλύψαμε τον τρόπο χειρισμού των εξαιρέσεων καθώς και τον τρόπο δημιουργίας ορισμένων εξαιρέσεων.
Στη συνέχεια, ελέγξτε τους κοινούς τύπους σφαλμάτων Python και τον τρόπο επίλυσής τους.