Οι εξαιρέσεις είναι ένας ισχυρός και χαριτωμένος τρόπος χειρισμού σφαλμάτων στα προγράμματα Python σας. Οι προσαρμοσμένες εξαιρέσεις μεταφέρουν αυτήν τη δύναμη σε ένα νέο επίπεδο.
Οι ενσωματωμένες κλάσεις εξαιρέσεων της Python δεν αντιμετωπίζουν ορισμένες καταστάσεις σφαλμάτων που μπορεί να προκύψουν στον κώδικά σας. Σε τέτοιες περιπτώσεις, θα χρειαστεί να δημιουργήσετε προσαρμοσμένες εξαιρέσεις για να χειριστείτε αποτελεσματικά αυτά τα σφάλματα.
Στην Python, μπορείτε να ορίσετε προσαρμοσμένες εξαιρέσεις και να τις αυξήσετε όταν προκύπτουν συγκεκριμένες καταστάσεις σφάλματος. Μπορείτε να διαχειριστείτε συγκεκριμένα, ενημερωτικά σφάλματα με προσαρμοσμένες εξαιρέσεις, βελτιώνοντας την αναγνωσιμότητα και τη δυνατότητα συντήρησης του κώδικά σας.
Γιατί χρειάζεστε προσαρμοσμένες εξαιρέσεις;
Κατά την ανάπτυξη μιας εφαρμογής, μπορεί να προκύψουν διάφορα σενάρια σφαλμάτων λόγω αλλαγών στον κώδικα, ενσωμάτωσης με άλλα πακέτα ή βιβλιοθήκες και αλληλεπιδράσεων με εξωτερικές εφαρμογές. Είναι σημαντικό να χειριστείτε αυτά τα σφάλματα για να ανακτήσετε από αυτά ή να χειριστείτε την αποτυχία με χάρη.
Η Python προσφέρει μια σειρά από ενσωματωμένη εξαίρεση κλάσεις που καλύπτουν σφάλματα όπως ValueError, Τυπογραφικό λάθος, FileNotFoundError, κι αλλα. Αν και αυτές οι ενσωματωμένες εξαιρέσεις εξυπηρετούν καλά τον σκοπό τους, μπορεί μόνο μερικές φορές να αντιπροσωπεύουν με ακρίβεια τα σφάλματα που μπορεί να προκύψουν στην εφαρμογή σας.
Δημιουργώντας προσαρμοσμένες εξαιρέσεις, μπορείτε να τις προσαρμόσετε ειδικά για να ταιριάζουν στις απαιτήσεις της εφαρμογής σας και να παρέχετε πληροφορίες για προγραμματιστές που χρησιμοποιούν τον κώδικά σας.
Πώς να ορίσετε προσαρμοσμένες εξαιρέσεις
Για να δημιουργήσετε προσαρμοσμένες εξαιρέσεις, ορίστε μια κλάση Python που κληρονομεί από το Κατηγορία εξαίρεσης. ο Εξαίρεση Η τάξη προσφέρει βασική λειτουργικότητα που θα χρειαστείτε για να χειριστείτε εξαιρέσεις και μπορείτε να την προσαρμόσετε για να προσθέσετε λειτουργίες με βάση τις συγκεκριμένες ανάγκες σας.
Κατά τη δημιουργία προσαρμοσμένων κλάσεων εξαιρέσεων, διατηρήστε τις απλές, ενώ συμπεριλαμβάνετε τα απαραίτητα χαρακτηριστικά για την αποθήκευση πληροφοριών σφάλματος. Οι χειριστές εξαιρέσεων μπορούν στη συνέχεια να έχουν πρόσβαση σε αυτά τα χαρακτηριστικά για να χειρίζονται σωστά τα σφάλματα.
Ακολουθεί μια προσαρμοσμένη τάξη εξαιρέσεων, MyCustomError:
classMyCustomError(Exception):
def__init__(self, message=None):
self.message = message
super().__init__(message)
Αυτή η κλάση δέχεται ένα προαιρετικό όρισμα μηνύματος κατά την προετοιμασία. Χρησιμοποιεί το σούπερ() μέθοδος κλήσης του κατασκευαστή της βάσης Εξαίρεση κατηγορία, η οποία είναι απαραίτητη για τον χειρισμό εξαιρέσεων.
Πώς να αυξήσετε προσαρμοσμένες εξαιρέσεις
Για να εμφανίσετε ένα σφάλμα, χρησιμοποιήστε το υψώνω λέξη-κλειδί ακολουθούμενη από μια παρουσία της κλάσης προσαρμοσμένης εξαίρεσης, μεταβιβάζοντάς της ένα μήνυμα σφάλματος ως όρισμα:
ifTrue:
raise MyCustomError("A Custom Error Was Raised...")
Μπορείτε επίσης να αυξήσετε το σφάλμα χωρίς να περάσετε κανένα όρισμα:
ifTrue:
raise MyCustomError # shorthand
Οποιαδήποτε μορφή είναι κατάλληλη για την αύξηση προσαρμοσμένων σφαλμάτων.
Πώς να χειριστείτε προσαρμοσμένες εξαιρέσεις
Ο χειρισμός προσαρμοσμένων εξαιρέσεων ακολουθεί την ίδια προσέγγιση όπως χειρισμός ενσωματωμένων εξαιρέσεων. Χρήση δοκιμάστε, εκτός, και τελικά μπλοκ για να συλλάβει προσαρμοσμένες εξαιρέσεις και να λάβει τις κατάλληλες ενέργειες.
try:
print("Hello, You're learning how to MakeUseOf Custom Errors")
raise MyCustomError("Opps, Something Went Wrong...")
except MyCustomError as err:
print(f"Error: {err}")
finally:
print("Done Handling Custom Error")
Με αυτόν τον τρόπο, μπορείτε να χειριστείτε όλες τις μορφές προσαρμοσμένων εξαιρέσεων που εγείρονται.
Εάν παρουσιαστεί εξαίρεση κατά την εκτέλεση του α δοκιμάστε μπλοκ, ένα αντίστοιχο εκτός μπλοκ μπορεί να το πιάσει και να το χειριστεί. Αν δεν υπάρχει κατάλληλο εκτός μπλοκ για να χειριστεί την εξαίρεση, οποιαδήποτε τελικά το μπλοκ θα εκτελεστεί, ακολουθούμενο από την αύξηση της εξαίρεσης ξανά. Χρησιμοποίησε ένα τελικά αποκλεισμός κυρίως για την εκτέλεση εργασιών εκκαθάρισης που πρέπει να εκτελούνται σε οποιεσδήποτε συνθήκες, είτε υπάρχει εξαίρεση είτε όχι.
try:
raise KeyboardInterrupt
except MyCustomError as err:
print(f"Error: {err}")
finally:
print("Did not Handle the KeyboardInterrupt Error. \
Can Only Handle MyCustomError")
Σε αυτό το δείγμα, α Διακοπή πληκτρολογίου υπάρχει εξαίρεση, αλλά το εκτός μπλοκ μόνο λαβές MyCustomError εξαιρέσεις. Σε αυτή την περίπτωση, το τελικά το μπλοκ εκτελείται και, στη συνέχεια, η μη χειριζόμενη εξαίρεση ανεβαίνει ξανά.
Κληρονόμηση προσαρμοσμένων κλάσεων σφαλμάτων
Βασισμένο στο έννοια του Αντικειμενοστρεφούς Προγραμματισμού (OOP), μπορείτε επίσης να κληρονομήσετε από προσαρμοσμένες κατηγορίες εξαιρέσεων, όπως ακριβώς και οι κανονικές κλάσεις. Με κληρονομιά από μια προσαρμοσμένη κλάση εξαιρέσεων, μπορείτε να δημιουργήσετε κλάσεις σφαλμάτων που παρέχουν πιο συγκεκριμένο πλαίσιο σε μια εξαίρεση. Αυτή η προσέγγιση σάς επιτρέπει να χειρίζεστε σφάλματα σε διαφορετικά επίπεδα στον κώδικά σας και παρέχει καλύτερη κατανόηση του τι προκάλεσε το σφάλμα.
Ας υποθέσουμε ότι αναπτύσσετε μια εφαρμογή Ιστού που αλληλεπιδρά με ένα εξωτερικό API. Αυτό το API ενδέχεται να έχει διαφορετικά σενάρια σφάλματος. Θα θέλετε να χειρίζεστε αυτά τα σφάλματα με συνέπεια και σαφήνεια σε όλο τον κώδικά σας. Για να το πετύχετε αυτό, δημιουργήστε μια προσαρμοσμένη κλάση εξαιρέσεων, BaseAPIEεξαίρεση:
classBaseAPIException(Exception):
Base class for API-related exceptions.
def__init__(self, message):
super().__init__(message)
self.message = message
Αφού έχετε αυτήν τη βασική προσαρμοσμένη κλάση εξαιρέσεων, μπορείτε να δημιουργήσετε θυγατρικές κλάσεις εξαίρεσης που κληρονομούν από αυτήν:
classAPINotFoundError(BaseAPIException):
Raised when the requested resource is not found in the API.
passclassAPIAuthenticationError(BaseAPIException):
Raised when there's an issue with authentication to the API.
pass
classAPIRateLimitExceeded(BaseAPIException):
Raised when the rate limit for API requests is exceeded.
pass
Αυξήστε και λάβετε αυτές τις προσαρμοσμένες εξαιρέσεις όταν πραγματοποιείτε κλήσεις στο API εντός της εφαρμογής Ιστού σας. Χειριστείτε τα ανάλογα χρησιμοποιώντας την κατάλληλη λογική στον κώδικά σας.
defrequest_api():
try:
# Simulate an API error for demonstration purposes
raise APINotFoundError("Requested resource not found.")
except APINotFoundError as err:
# Log or handle the 'Not Found' error case
print(f"API Not Found Error: {err}")
except APIAuthenticationError:
# Take appropriate actions for authentication error
print(f"API Authentication Error: {err}")
except APIRateLimitExceeded:
# Handle the rate limit exceeded scenario
print(f"API Rate Limit Exceeded: {err}")
except BaseAPIException:
# Handle other unknown API exceptions
print(f"Unknown API Exception: {err}")
Η ρήτρα τελικού εκτός ελέγχει τη γονική κλάση και λειτουργεί ως αιχμή για τυχόν άλλα σφάλματα που σχετίζονται με το API.
Όταν κληρονομείτε προσαρμοσμένες κλάσεις εξαίρεσης, μπορείτε να χειριστείτε αποτελεσματικά σφάλματα εντός του API. Αυτή η προσέγγιση σάς επιτρέπει να διαχωρίσετε τον χειρισμό σφαλμάτων από τις λεπτομέρειες εφαρμογής του API, διευκολύνοντας την προσθήκη προσαρμοσμένων εξαιρέσεων ή την πραγματοποίηση αλλαγών καθώς το API εξελίσσεται ή αντιμετωπίζει νέο σφάλμα περιπτώσεις.
Προσαρμοσμένες εξαιρέσεις αναδίπλωσης
Για να αναδιπλώσετε τις εξαιρέσεις σημαίνει να πιάσετε μια εξαίρεση, να την ενσωματώσετε σε μια προσαρμοσμένη εξαίρεση και, στη συνέχεια, να αυξήσετε αυτήν την προσαρμοσμένη εξαίρεση ενώ αναφέρετε την αρχική εξαίρεση ως την αιτία της. Αυτή η τεχνική βοηθά στην παροχή πλαισίου για τα μηνύματα σφάλματος και διατηρεί τις λεπτομέρειες υλοποίησης κρυφές από τον κωδικό κλήσης.
Εξετάστε το σενάριο όπου η εφαρμογή ιστού σας αλληλεπιδρά με ένα API. Εάν το API αυξήσει a Σφάλμα αναζήτησης, μπορείτε να το πιάσετε και μετά να ανεβάσετε ένα έθιμο APINotFoundError εξαίρεση που αναφέρει το LookupError ως αιτία:
defrequest_api():
try:
# Simulate an API error for demonstration purposes
# Assuming the external API raised a LookupError
raise LookupError("Sorry, You Encountered A LookUpError !!!")
except LookupError as original_exception:
try:
# Wrap the original exception with a custom exception
raise APINotFoundError \
("Requested resource not found.") from original_exception
except APINotFoundError as wrapped_exception:
# Handle the wrapped exception here
print(f"Caught wrapped API exception: {wrapped_exception}")# or re-raise it if necessary
raise
try:
request_api()
except APINotFoundError as err:
print(f"Caught API exception: {err.__cause__}")
Χρησιμοποίησε ένα από ρήτρα με το υψώνω δήλωση για αναφορά στην αρχική εξαίρεση εντός της προσαρμοσμένης εξαίρεσης.
Όταν εμφανίζεται η προσαρμοσμένη εξαίρεση, περιλαμβάνει την αρχική εξαίρεση ως α __αιτία__ χαρακτηριστικό, παρέχοντας μια σύνδεση μεταξύ της προσαρμοσμένης εξαίρεσης και του αρχικού. Αυτό σας επιτρέπει να εντοπίσετε την προέλευση μιας εξαίρεσης.
Αναδιπλώνοντας εξαιρέσεις, μπορείτε να παρέχετε πιο ουσιαστικό πλαίσιο και να στέλνετε πιο κατάλληλα μηνύματα σφάλματος στους χρήστες, χωρίς να αποκαλύπτετε εσωτερικές λεπτομέρειες υλοποίησης του κώδικά σας ή του API. Σας επιτρέπει επίσης να διαχειρίζεστε και να αντιμετωπίζετε τύπους σφαλμάτων με δομημένο και ομοιόμορφο τρόπο.
Προσαρμογή της συμπεριφοράς τάξης στην Python
Κληρονομώντας τη βασική κλάση εξαιρέσεων που παρέχει η Python, μπορείτε να δημιουργήσετε απλές και χρήσιμες εξαιρέσεις που μπορείτε να δημιουργήσετε όταν συμβαίνουν συγκεκριμένα σφάλματα στον κώδικά σας. Μπορείτε επίσης να εφαρμόσετε προσαρμοσμένη συμπεριφορά για τις κλάσεις εξαίρεσης με τη βοήθεια μεθόδων magic ή dunder.