python try except python handling exception with examples
Αυτό το σεμινάριο εξηγεί το Exception Handling στο Python χρησιμοποιώντας το μπλοκ Try Except με τη βοήθεια παραδειγμάτων προγραμματισμού:
Δύο τύποι σφαλμάτων ενδέχεται να προκαλέσουν απότομη διακοπή ενός προγράμματος Python, δηλαδή Σφάλματα σύνταξης , και Εξαιρέσεις . Σε αυτό το σεμινάριο, θα συζητήσουμε τον δεύτερο τύπο σφάλματος (Εξαιρέσεις) σε διάφορα σημαντικά θέματα.
Θα επωφεληθούμε πολύ από το χειρισμό εξαιρέσεων στην εφαρμογή μας, όπως:
- Δημιουργία μιας ισχυρής εφαρμογής.
- Δημιουργία ενός καθαρού κώδικα χωρίς σφάλματα.
=> Επισκεφθείτε εδώ για την αποκλειστική σειρά εκπαιδευτικών εκπαιδευτικών Python
c ++ απροσδιόριστη αναφορά στη λειτουργία
Τι θα μάθετε:
- Python Δοκιμάστε την εξαίρεση
- Κοινές εξαιρέσεις Python
- συμπέρασμα
Python Δοκιμάστε την εξαίρεση
Ένα καλό νέο είναι ότι η Python έχει έναν καλό αριθμό ενσωματωμένων εξαιρέσεων για να εντοπίσει σφάλματα στον κώδικα μας. Επίσης, μας δίνει την ευκαιρία να δημιουργήσουμε προσαρμοσμένες εξαιρέσεις όταν καμία από τις ενσωματωμένες εξαιρέσεις δεν ταιριάζει στις ανάγκες μας.
Τι είναι μια εξαίρεση
Ποια είναι λοιπόν μια εξαίρεση στην Python; Λοιπόν, με απλούς όρους, κάθε φορά που ο διερμηνέας Python προσπαθεί να εκτελέσει μη έγκυρο κώδικα, δημιουργεί μια εξαίρεση και στις περιπτώσεις που δεν γίνεται χειρισμός μιας τέτοιας εξαίρεσης, διαταράσσει την κανονική ροή των οδηγιών του προγράμματος και εκτυπώνει ένα ίχνος επιστροφής.
Ας δημιουργήσουμε έναν μη έγκυρο κωδικό και να δούμε πώς θα ανταποκριθεί ο διερμηνέας Python.
Ανοίξτε ένα κέλυφος Python και εκτελέστε τον ακόλουθο κώδικα.
>>> 50/0
Αυτό είναι ένα από τα πιο συνηθισμένα σφάλματα στον προγραμματισμό. Ο παραπάνω κωδικός προσπαθεί να διαιρέσει τον αριθμό πενήντα με 0 (μηδέν). Ο διερμηνέας Python το βλέπει ως μη έγκυρη λειτουργία και εγείρει ένα Σφάλμα ZeroDivision , διακόπτει το πρόγραμμα και εκτυπώνει ένα ίχνος επιστροφής.
Μπορούμε να το δούμε ξεκάθαρα Σφάλμα ZeroDivision είναι η εξαίρεση που τέθηκε. Είναι πράγματι ο τρόπος της Python να μας πει ότι δεν είναι ωραίο να διαιρούμε έναν αριθμό με μηδέν. Αν και σε άλλες γλώσσες όπως το JavaScript, αυτό δεν είναι σφάλμα. και ο πύθωνας απαγορεύει αυστηρά αυτήν την πρακτική.
Επίσης, είναι σημαντικό να γνωρίζετε ότι αυτό είναι απλώς ένα αντικείμενο εξαίρεσης και η Python έχει πολλά τέτοια αντικείμενα ενσωματωμένα. Ρίξτε μια ματιά σε αυτόν τον αξιωματούχο της Python τεκμηρίωση για να δείτε όλες τις ενσωματωμένες εξαιρέσεις Python.
Κατανόηση του Traceback
Προτού μπορέσουμε να χειριστούμε τις εξαιρέσεις, νομίζω ότι θα βοηθήσει να κατανοήσουμε τι ακριβώς θα συμβεί εάν δεν αντιμετωπιστούν οι εξαιρέσεις και πώς η Python κάνει το καλύτερο δυνατό για να μας ενημερώσει για το σφάλμα μας.
Κάθε φορά που η Python συναντά ένα σφάλμα, δημιουργεί μια εξαίρεση. Εάν αυτή η εξαίρεση δεν αντιμετωπιστεί, τότε παράγει ορισμένες πληροφορίες που ονομάζονται Traceback. Λοιπόν, ποιες πληροφορίες περιέχει αυτό το traceback;
Περιέχει:
- Το μήνυμα σφάλματος που μας λέει ποια εξαίρεση δημιουργήθηκε και τι συνέβη πριν από αυτήν την εξαίρεση.
- Οι διάφοροι αριθμοί γραμμής του κώδικα που προκάλεσαν αυτό το σφάλμα. Ένα σφάλμα μπορεί να προκληθεί από μια ακολουθία κλήσεων λειτουργίας που ονομάζεται a στοίβα κλήσεων που θα συζητήσουμε αργότερα εδώ.
Αν και είναι λίγο συγκεχυμένο, υποσχόμαστε ότι το επόμενο παράδειγμα θα φέρει περισσότερο φως στην κατανόησή μας.
Θυμηθείτε το ίχνος επιστροφής που εκτυπώθηκε από τη διαίρεση 50 με 0 παραπάνω, μπορούμε να δούμε ότι το ίχνος επιστροφής περιέχει τις ακόλουθες πληροφορίες:
- Αρχείο '': Αυτό μας λέει ότι αυτός ο κωδικός εκτελέστηκε από ένα τερματικό κονσόλας.
- γραμμή 1: Αυτό μας λέει ότι το σφάλμα προέκυψε σε αυτόν τον αριθμό γραμμής.
- Σφάλμα ZeroDivision: διαίρεση με μηδέν: Μας λέει ποια εξαίρεση τέθηκε και τι την προκάλεσε.
Ας δοκιμάσουμε ένα άλλο παράδειγμα και ίσως να δούμε πώς ένα στοίβα κλήσεων μοιάζει με. Ανοίξτε ένα πρόγραμμα επεξεργασίας, εισαγάγετε τον κωδικό παρακάτω και αποθηκεύστε ως tracebackExp .py
def stack1(numb): # 1 div = 0 # 2 stack2(numb, div) # 3 def stack2(numb, div): # 5 compute = numb/div # 6 print(compute) # 7 if __name__ == '__main__': # 9 numb = 5 # 10 stack1(numb) # 11
Ανοίξτε ένα τερματικό στον κατάλογο όπου βρίσκεται και εκτελείται αυτό το αρχείο.
python tracebackExp.py
Θα δείτε το ακόλουθο traceback:
Το παραπάνω ίχνος μπορεί να φαίνεται συγκεχυμένο, αλλά στην πραγματικότητα, δεν είναι. Ο Πυθωνίστας βρήκε τον καλύτερο τρόπο για να διαβάσει το traceback, που είναι από το από κάτω προς τα πάνω . Ας χρησιμοποιήσουμε λοιπόν αυτήν τη σοφία για να προσπαθήσουμε να κατανοήσουμε τι έχει να προσφέρει αυτό το traceback.
- Στο κάτω μέρος, έχουμε την εξαίρεση που αναφέρθηκε και γιατί ανατράφηκε.
- Προχωρώντας, παίρνουμε το όνομα του αρχείου tracebackExp .py όπου προέκυψε αυτό το σφάλμα, ο υπολογισμός που προκάλεσε αυτό το σφάλμα compute = numb / div, η συνάρτηση stack2 και η γραμμή αριθμού συνδέσμου 6 όπου πραγματοποιήθηκε αυτός ο υπολογισμός.
- Προχωρώντας, βλέπουμε ότι η συνάρτηση stack2 κλήθηκε στη συνάρτηση stack1 στη γραμμή 3.
- Προχωρώντας στην κορυφή, βλέπουμε ότι η συνάρτηση stack1 κλήθηκε στον αριθμό γραμμής 11.< μονάδα μέτρησης > μας λέει ότι είναι το αρχείο που εκτελείται.
Κοινές εξαιρέσεις Python
Η βιβλιοθήκη Python καθορίζει πάρα πολλές ενσωματωμένες εξαιρέσεις. Μπορείτε να ελέγξετε την τεκμηρίωση Python ή να καλέσετε το ενσωματωμένο τοπικός () Λειτουργία όπως παρακάτω:
>>> dir(locals()('__builtins__'))
Δεν θα προσπαθήσουμε να αντιμετωπίσουμε όλες αυτές τις εξαιρέσεις, αλλά θα δούμε μερικές κοινές εξαιρέσεις που πιθανότατα θα συναντήσετε.
# 1) TypeError
Εμφανίζεται όταν μια λειτουργία ή συνάρτηση εφαρμόζεται σε ένα αντικείμενο ακατάλληλου τύπου.
Παράδειγμα 1
Εξετάστε το παρακάτω πρόγραμμα. Παίρνει ένα μέρισμα και διαιρέτη, στη συνέχεια υπολογίζει και εκτυπώνει το αποτέλεσμα της διαίρεσης του μερίσματος από τον διαιρέτη.
def compute_division(): dividend = int(input('Enter the dividend: ')) # cast string to int divisor = input('Enter the divisor: ') # no casting # Compute division result = dividend/divisor # print result print('The result of {}/{} is: {}'.format(dividend, divisor, result)) if __name__ == '__main__': result = compute_division()
Ζητούμε την αξία του μερίσματος και του διαιρέτη από τον χρήστη, αλλά ξεχνάμε να μετατρέψουμε την τιμή συμβολοσειράς του διαιρέτη σε ακέραιο. Λοιπόν, καταλήγουμε με τον τύπο του μερίσματος να είναι ακέραιος ( int ) και ο τύπος του διαιρέτη είναι συμβολοσειρά ( Π ). Στη συνέχεια παίρνουμε το Τυπογραφικό λάθος καθώς ο τελεστής διαίρεσης (/) δεν λειτουργεί με χορδές.
Μπορεί να σας ενδιαφέρει να γνωρίζετε ότι, σε αντίθεση με την Python, το Javascript έχει Type Coercion που βασικά μετατρέπει έναν από τους τύπους του τελεστή σε ισοδύναμη τιμή του τύπου του άλλου τελεστή όταν οι τελεστές είναι διαφορετικών τύπων.
# 2) ValueError
Αυτό προκύπτει όταν μια λειτουργία ή συνάρτηση λαμβάνει ένα όρισμα που έχει τον σωστό τύπο αλλά μια ακατάλληλη τιμή.
Παράδειγμα 2
Εξετάστε το πρόγραμμά μας Παράδειγμα 1 πάνω από.
Εάν ο χρήστης εισάγει μια αλφαριθμητική τιμή για το μέρισμα όπως «3a», τότε το πρόγραμμά μας θα αυξήσει την εξαίρεση ValueError. Αυτό συμβαίνει επειδή, αν και ο Python int () Η μέθοδος λαμβάνει οποιονδήποτε αριθμό ή συμβολοσειρά και επιστρέφει ένα ακέραιο αντικείμενο, η τιμή συμβολοσειράς δεν πρέπει να περιέχει γράμματα ή καμία μη αριθμητική τιμή.
# 3) Σφάλμα Attribute
Αυτή η εξαίρεση δημιουργείται κατά την εκχώρηση ή την αναφορά ενός χαρακτηριστικού που δεν υπάρχει.
Παράδειγμα 3
Εξετάστε το παρακάτω πρόγραμμα. Παίρνει έναν αριθμό και υπολογίζει την τετραγωνική ρίζα του χρησιμοποιώντας το Ενότητα μαθηματικών Python
import math # import math library to gain access to its code def compute_square_root(number): # compute the square root using the math library result = math.sqr(number) return result if __name__ == '__main__': # get input to compute from user number = int(input('Compute Square root of: ')) # call function to compute square root
Όταν ένας χρήστης εισάγει έναν αριθμό, το πρόγραμμά μας προσπαθεί να χρησιμοποιήσει μια συνάρτηση από τη μαθηματική ενότητα για να υπολογίσει την τετραγωνική ρίζα της, αλλά ακριβώς εδώ, κάναμε ένα σφάλμα. Αντί για sqrt, πληκτρολογήσαμε κατά λάθος sqr που δεν υπάρχει στη μαθηματική ενότητα.
Έτσι, προσπαθήσαμε να αναφέρουμε ένα χαρακτηριστικό sqr που δεν υπάρχει και οδήγησε στην εξαίρεση του AttributeError. Οι περισσότεροι από εμάς κάνουν αυτό το είδος λάθους πολύ. Έτσι, δεν είστε μόνοι.
Χειρισμός εξαιρέσεων με δοκιμή εξαίρεση
Ως προγραμματιστής, ένα πράγμα στο οποίο οι περισσότεροι από εμάς θα ξοδέψουμε το χρόνο μας είναι να γράψουμε έναν ισχυρό κώδικα που να είναι ανθεκτικός. Κωδικός που δεν σπάει λόγω ορισμένων σφαλμάτων. Στην Python, μπορούμε να το επιτύχουμε περικλείοντας τις δηλώσεις μας μέσα σε ένα προσπαθήστε - εκτός δήλωση.
Δήλωση Python Try-Except
Η δήλωση try-kecuali έχει την ακόλουθη δομή:
try: #your code goes here except '''Specify exception type(s) here''': #handle exception here
Ας επισυνάψουμε τον κωδικό tracebackExp .py μέσα σε μια δήλωση δοκιμής-εκτός.
def stack1(numb): # 1 div = 0 # 2 stack2(numb, div) # 3 def stack2(numb, div): # 5 try: # 6 compute = numb/div # 7 print(compute) # 8 except ZeroDivisionError as zde: # 9 print(zde) # 10 if __name__ == '__main__': # 12 numb = 5 # 13 stack1(numb) # 14 print('program continuous') # 15
Η εκτέλεση αυτού του κώδικα θα παράγει την έξοδο
Έτσι λειτουργεί η δήλωση try-kecuali. Η Python εκτελεί τον κώδικα στο μπλοκ δοκιμής γραμμή 7-8 . Εάν δεν βρεθεί μη έγκυρος κωδικός, τότε ο κωδικός στο μπλοκ εκτός γραμμή 10 παραλείπεται και η εκτέλεση συνεχίζεται.
Όμως, εάν βρεθεί ένας άκυρος κωδικός, τότε η εκτέλεση σταματά αμέσως στο μπλοκ δοκιμών και ελέγχει εάν η εξαίρεση που δημιουργήθηκε ταιριάζει με αυτήν που παρέχουμε στη δήλωση εκτός γραμμή 9 . Εάν ταιριάζει, τότε το μπλοκ εκτός λειτουργίας εκτελείται και συνεχίζεται. Εάν δεν το κάνει, τότε το πρόγραμμα θα διακοπεί.
Το try-block συνήθως περιέχει τον κώδικα που μπορεί να δημιουργήσει μια εξαίρεση, ενώ το kecuali-block πιάνει και χειρίζεται την εξαίρεση.
Χειρισμός πολλαπλών εξαιρέσεων με εξαίρεση
Μπορούμε να χειριστούμε πολλές εξαιρέσεις με ένα μόνο 'εκτός' ή πολλαπλά 'εξαιρέσεις'. Όλα εξαρτώνται από το πώς θέλετε να χειριστείτε κάθε εξαίρεση.
# 1) Χειρισμός πολλαπλών εξαιρέσεων με μία εξαίρεση
try: #your code goes here except(Exception1(, Exception2(,...ExceptionN)))): #handle exception here
Αυτή η μέθοδος χρησιμοποιείται όταν υποψιαζόμαστε ότι ο κώδικάς μας μπορεί να δημιουργήσει διαφορετικές εξαιρέσεις και θέλουμε να κάνουμε την ίδια ενέργεια σε κάθε περίπτωση. Έτσι, εάν ο διερμηνέας Python εντοπίσει έναν αγώνα, τότε θα εκτελεστεί ο κωδικός που γράφεται στο μπλοκ εκτός.
Ας δούμε το παρακάτω παράδειγμα κώδικα Python
πώς να εκτυπώσετε έναν πίνακα σε αντίστροφη σειρά java
def get_fraction(value, idx): arr = (4,5,2,0) # a list of numbers idx_value = arr(idx) # if idx is > arr length, IndexError will be raised value/idx_value # if idx_value == 0, ZeroDivisionError will be raised if __name__ =='__main__': # set 'value' and 'idx' value = 54 idx = 3 # call function in a try-except statement. try: result = get_fraction(value, idx) print('Fraction is ', result) except (IndexError, ZeroDivisionError) as ex: print(ex)
Έχουμε δύο πιθανές εξαιρέσεις που θα μπορούσαν να τεθούν εδώ, Σφάλμα ZeroDivision και Σφάλμα ευρετηρίου . Εάν προκύψει οποιαδήποτε από αυτές τις εξαιρέσεις, τότε θα εκτελεστεί το μπλοκ εκτός.
Στον παραπάνω κωδικό, idx = 3, έτσι idx_ αξία γίνεται 0 και αξία / idx_ αξία θα αυξήσει το ZeroDivisionError
# 2) Διαχείριση πολλαπλών εξαιρέσεων με πολλαπλές εξαιρέσεις
try: #your code goes here except Exception1: #handle exception1 here except Exception2: #handle exception2 here except ExceptionN: #handle exceptionN here
Εάν προτιμούμε να χειριστούμε κάθε εξαίρεση ξεχωριστά, τότε μπορείτε να το κάνετε.
Εξετάστε το παρακάτω παράδειγμα κώδικα Python
def get_fraction(value, idx): arr = (4,5,2,0) # a list of numbers idx_value = arr(idx) # if idx is > arr length, IndexError will be raised value/idx_value # if idx_value == 0, ZeroDivisionError will be raised if __name__ =='__main__': # set 'value' and 'idx' value = 54 idx = 5 # call function in a try-excepts statement. try: result = get_fraction(value, idx) print('Fraction is ', result) except IndexError: print('idx of {} is out of range'.format(idx)) except ZeroDivisionError: print('arr({}) is 0. Hence, can't divide by zero'.format(idx)) except Exception as ex: print(ex) print('Not sure what happened so not safe to continue, app will be interrupted') raise ex
Παρατηρούμε εδώ ότι η εξαίρεση χρησιμοποιήθηκε στην τελευταία εξαίρεση δήλωση. Αυτό συμβαίνει επειδή το αντικείμενο εξαίρεσης Exception αντιστοιχεί σε οποιαδήποτε εξαίρεση. Για αυτόν τον λόγο, θα πρέπει να είναι πάντα το τελευταίο, καθώς η Python θα σταματήσει να ελέγχει άλλους χειριστές εξαιρέσεων μόλις ένας αγωνιστεί.
Στον παραπάνω κώδικα, idx = 5 , ως εκ τούτου arr (idx) θα αυξηθεί Σφάλμα ευρετηρίου επειδή idx είναι μεγαλύτερο από το μήκος της λίστας αρ
Επίσης, δεν είστε σίγουροι ποια εξαίρεση προέκυψε από την εφαρμογή σας δεν είναι ποτέ ασφαλές να συνεχίσετε την εκτέλεση. Αυτός είναι ο λόγος για τον οποίο έχουμε τον τύπο Εξαίρεση για να πιάσουμε τυχόν απρόβλεπτες εξαιρέσεις. Στη συνέχεια, ενημερώνουμε τον χρήστη και διακόπτουμε την εφαρμογή αυξάνοντας την ίδια εξαίρεση.
Δοκιμάστε τη δήλωση Else
Αυτό είναι ένα προαιρετικό χαρακτηριστικό του χειρισμού εξαιρέσεων και σας επιτρέπει να προσθέσετε κώδικα που θέλετε να εκτελέσετε όταν δεν προέκυψαν σφάλματα. Εάν παρουσιαστεί σφάλμα, αυτό το μπλοκ αλλού δεν θα εκτελεστεί.
Εξετάστε το παράδειγμα του κώδικα Python παρακάτω, ανοίξτε τον επεξεργαστή σας και αποθηκεύστε τον κώδικα ως else Try.py
def fraction_of_one(divisor): value = 1/divisor # if divisor is zero, ZeroDivisionError will be raised return value if __name__ == '__main__': while True: try: # Get input from the user. # if input is not a valid argument for int(), ValueError will be raised divisor = int(input('Enter a divisor: ')) # call our function to compute the fraction value = fraction_of_one(divisor) except (ValueError, ZeroDivisionError): print('Input can't be zero and should be a valid literal for int(). Please, try again!') else: print('Value: ', value) break
Παίρνουμε πληροφορίες από τον χρήστη και το χρησιμοποιούμε για να διαιρέσουμε 1. Έχουμε δύο πιθανές εξαιρέσεις εδώ, μια μη έγκυρη εισαγωγή χρήστη που θα προκαλέσει Σφάλμα Value και ένα μηδέν (0) που θα προκαλέσει Σφάλμα ZeroDivision . Η εξαίρεση από τη δήλωσή μας χειρίζεται αυτά τα σφάλματα.
Τώρα, θέλουμε να εκτυπώσουμε την τιμή του αξία . Ο άλλος αποκλεισμός μας διασφαλίζει ότι εκτυπώνεται μόνο εάν το μπλοκ δοκιμής μας εκτελείται χωρίς σφάλμα. Αυτό είναι σημαντικό επειδή εάν παρουσιαστεί σφάλμα στο μπλοκ δοκιμής μας, το αξία θα είναι απροσδιόριστο. Έτσι, η πρόσβαση σε αυτό θα δημιουργήσει ένα άλλο σφάλμα.
Εκτελέστε τον παραπάνω κώδικα με το Python else Try.py
Η παραπάνω έξοδος δείχνει ότι για την πρώτη εισαγωγή, πληκτρολογήσαμε 0 και πιέσατε το ENTER. Δεδομένου ότι ο διαιρέτης μας έλαβε 0, 1 / ο διαιρέτης αυξήθηκε zeroDivisionError . Η δεύτερη εισαγωγή μας ήταν k, η οποία δεν είναι έγκυρη για int (), εξ ου και η εξαίρεση Σφάλμα Value αυξάνεται.
Αλλά η τελευταία μας καταχώρηση ήταν 9, η οποία είναι έγκυρη και, ως εκ τούτου, έχουμε την τιμή του “ αξία 'Τυπωμένο ως 0.1111111111111111
Δοκιμάστε τελικά δήλωση
Αυτό είναι επίσης ένα προαιρετικό χαρακτηριστικό χειρισμού εξαιρέσεων και θα εκτελείται πάντα ανεξάρτητα από το τι συμβαίνει στους χειριστές εξαιρέσεων.
Αυτό είναι:
- Είτε συμβαίνει εξαίρεση είτε όχι
- Ακόμα κι αν μια «επιστροφή» καλείται στα άλλα μπλοκ.
- Ακόμα κι αν το σενάριο κλείσει στα άλλα μπλοκ
Άρα, εάν έχουμε έναν κωδικό που θέλουμε να τρέξουμε σε όλες τις καταστάσεις, τελικά το μπλοκ είναι ο τύπος μας. Αυτό το μπλοκ χρησιμοποιείται ως επί το πλείστον για καθαρισμούς όπως το κλείσιμο αρχείων.
Εξετάστε το παρακάτω παράδειγμα κώδικα Python
def readFile(file_path): try: openFile = open(file_path,'r') # Open a file as read-only print(openFile.readline()) # Read first line of file content except FileNotFoundError as ex: print(ex) finally: print('Cleaning...') openFile.close() if __name__ == '__main__': filePath = './text.txt' readFile(filePath)
Αυτός ο κωδικός προσπαθεί να ανοίξει και να διαβάσει το αρχείο text.txt στον τρέχοντα κατάλογό του. Εάν το αρχείο υπάρχει, τότε το πρόγραμμά μας θα εκτυπώσει την πρώτη γραμμή του αρχείου και στη συνέχεια το μπλοκ επιτέλους θα τρέξει και θα κλείσει το αρχείο.
Ας πούμε ότι έχουμε ένα αρχείο που ονομάζεται text.txt στον κατάλογο στον οποίο βρίσκεται αυτό το αρχείο προγράμματος και περιέχει το Hello. Εάν εκτελέσουμε το πρόγραμμα, θα έχουμε την έξοδο
Αυτό το παράδειγμα επιλέχθηκε σκόπιμα επειδή ήθελα να αντιμετωπίσουμε ένα μικρό πρόβλημα που μπορεί να προκύψει κατά το κλείσιμο αρχείων στο μπλοκ επιτέλους.
Εάν το αρχείο δεν υπάρχει, η εξαίρεση FileNotFoundError θα αυξηθεί και η μεταβλητή άνοιγμα αρχείου δεν θα οριστεί και δεν θα είναι αντικείμενο αρχείου. Ως εκ τούτου, η προσπάθεια να το κλείσει στο μπλοκ τελικά θα δημιουργήσει μια εξαίρεση Χωρίς περιορισμούςLocalError που είναι μια υποκατηγορία του Όνομα Σφάλμα .
Αυτό βασικά λέει ότι προσπαθούμε να αναφέρουμε τη μεταβλητή άνοιγμα αρχείου πριν από την ανάθεση.
Ένα μικρό κόλπο εδώ είναι να χρησιμοποιήσετε χειριστές εξαιρέσεων μέσα στο μπλοκ επιτέλους.
def readFile(file_path): try: openFile = open(file_path,'r') # Open a file as read-only print(openFile.readline()) # Read first line of file content except FileNotFoundError as ex: print(ex) finally: try: print('Cleaning...') openFile.close() except: # catches all exceptions pass # Ignore this error because we don't care. if __name__ == '__main__': filePath = './text.txt' readFile(filePath)
Εάν το μπλοκ δοκιμής μας δημιουργήσει το FileNotFoundError, τότε θα έχουμε την ακόλουθη έξοδο
Αύξηση εξαίρεσης
Ένα καλό νέο για τις εξαιρέσεις της Python είναι ότι μπορούμε να τις αυξήσουμε σκόπιμα. Οι εξαιρέσεις δημιουργούνται με το αύξηση δήλωσης .
Η δήλωση αύξησης έχει την ακόλουθη σύνταξη:
raise (ExceptionName((*args: Object)))
Ανοίξτε ένα τερματικό και ανεβάστε οποιοδήποτε αντικείμενο εξαίρεσης από το Ενσωματωμένες εξαιρέσεις Python. Για παράδειγμα, αν αυξήσουμε το ZeroDivisionError:
>>> raise ZeroDivisionError('Can't divide by zero')
Θα λάβουμε το ίχνος:
Λοιπόν, γιατί είναι σημαντικό να δημιουργηθούν εξαιρέσεις;
- Όταν εργάζεστε με προσαρμοσμένες εξαιρέσεις.
- Κατά τη διάρκεια των ελέγχων υγιεινής.
Προσαρμοσμένα μαθήματα εξαίρεσης
Μια προσαρμοσμένη εξαίρεση είναι αυτή που δημιουργείτε για να χειριστείτε λάθη που είναι ειδικά για τις ανάγκες σας. Το κόλπο είναι, ορίζουμε μια κλάση που προέρχεται από το αντικείμενο Εξαίρεση , τότε χρησιμοποιούμε τη δήλωση αύξησης για να αυξήσουμε την κατηγορία εξαίρεσης.
Ας υποθέσουμε ότι θέλουμε να ελέγξουμε την είσοδο του χρήστη και να βεβαιωθούμε ότι η τιμή εισόδου δεν είναι αρνητική (έλεγχος υγιεινής). Φυσικά, θα μπορούσαμε να αυξήσουμε το ValueError εξαίρεσης Python, αλλά θα θέλαμε να προσαρμόσουμε το σφάλμα δίνοντάς του ένα συγκεκριμένο και αυτονόητο όνομα όπως InputIsNegativeError . Αλλά αυτή η εξαίρεση δεν είναι μια ενσωματωμένη εξαίρεση Python.
Πρώτα λοιπόν, δημιουργούμε τη βασική μας τάξη που θα προέρχεται από την Εξαίρεση.
class CustomError(Exception): 'Base class exception for all exceptions of this module' pass
Στη συνέχεια, δημιουργούμε την κατηγορία εξαίρεσης που θα κληρονομήσει την βασική τάξη και θα χειριστεί το συγκεκριμένο σφάλμα.
class InputIsNegativeError(CustomError): '''Raised when User enters a negative value''' pass
Ας το δοκιμάσουμε αυτό
try: value = int(input()) if value <0: raise InputIsNegativeError # Raise exception if value is negative except InputIsNegativeError: # catch and handle exception print('Input value shouldn't be negative')
Το παραπάνω αίτημα κώδικα για εισαγωγή χρήστη και ελέγξτε αν είναι αρνητικό. Εάν είναι αληθές, αυξάνει την προσαρμοσμένη εξαίρεση μας InputIsNegativeError, η οποία αργότερα παγιδεύεται στην εξαίρεση-δήλωση.
Παρακάτω είναι ο πλήρης κωδικός:
class CustomError(Exception): 'Base class exception for all exceptions of this module' pass class InputIsNegativeError(CustomError): '''Raised when User enters a negative value''' pass if __name__ == '__main__': try: value = int(input('Input a number: ')) if value <0: raise InputIsNegativeError # Raise exception if value is negative except InputIsNegativeError: # catch and handle exception print('Input value shouldn't be negative')
Εάν η τιμή εισαγωγής είναι αρνητικός αριθμός όπως -1, τότε θα έχουμε την έξοδο:
Δείτε το Έγγραφο Python για περισσότερες λεπτομέρειες σχετικά με τις εξαιρέσεις Python.
Συχνές Ερωτήσεις
Ε # 1) Πώς χειρίζεται η Python μια εξαίρεση;
Απάντηση: Η Python χειρίζεται εξαιρέσεις χρησιμοποιώντας το δοκιμή-εκτός από τη δήλωση . Ο κωδικός που μπορεί να δημιουργήσει μια εξαίρεση τοποθετείται και εκτελείται στο δοκιμάστε να μπλοκάρετε ενώ το εκτός από το μπλοκ διατηρεί τον κωδικό που θα χειριστεί τις εξαιρέσεις εάν προκύψει.
υλοποίηση ουράς προτεραιότητας στο java
Q # 2) Τι δημιουργεί μια εξαίρεση στο Python;
Απάντηση: Κάθε φορά που ο διερμηνέας Python συναντά έναν άκυρο κωδικό, δημιουργεί μια εξαίρεση, που είναι ο τρόπος της Python για να μας πει ότι συνέβη κάτι απροσδόκητο. Μπορούμε επίσης να αυξήσουμε σκόπιμα εξαιρέσεις χρησιμοποιώντας το αύξηση δήλωσης .
Q # 3) Πώς χειρίζεται η Python πολλές εξαιρέσεις;
Απάντηση: Η Python χειρίζεται πολλές εξαιρέσεις χρησιμοποιώντας ένα μόνο εκτός από μπλοκ ή πολλαπλά εκτός από μπλοκ.
Για ένα μόνο μπλοκ, οι εξαιρέσεις περνούν ως πλειάδα: εκτός (Exception1, Exception2, .., ExceptionN) και η Python ελέγχει για έναν αγώνα από τα δεξιά προς τα αριστερά. Σε αυτήν την περίπτωση, λαμβάνεται η ίδια ενέργεια για κάθε εξαίρεση.
Ένας άλλος τρόπος για να πιάσετε όλες τις εξαιρέσεις είναι να αφήσετε το όνομα της εξαίρεσης μετά τη λέξη κλειδί εκτός.
except: # handle all exceptions here
Ο δεύτερος τρόπος είναι να χρησιμοποιήσετε ένα μπλοκ εκτός από κάθε εξαίρεση:
except Exception1: # code to handle Exception1 goes here except Exception2: # code to handle Exception2 goes here except ExceptionN: # code to handle ExceptionN goes here
Με αυτόν τον τρόπο, μπορείτε να κάνετε ξεχωριστές ενέργειες για κάθε εξαίρεση.
Q # 4) Γιατί είναι σημαντικός ο χειρισμός της εξαίρεσης στην Python;
Απάντηση: Το πλεονέκτημα του χειρισμού εξαιρέσεων στο Python είναι ότι μπορούμε να δημιουργήσουμε ισχυρές, καθαρές και χωρίς σφάλματα εφαρμογές. Δεν θα θέλαμε να καταρρεύσει ο κωδικός παραγωγής μας λόγω ορισμένων σφαλμάτων, επομένως χειριζόμαστε τα σφάλματα και διατηρούμε την εφαρμογή μας σε λειτουργία.
Ε # 5) Πώς αγνοείτε μια εξαίρεση στο Python;
Απάντηση: Για να αγνοήσετε μια εξαίρεση στο Python, χρησιμοποιήστε το πέρασμα λέξη-κλειδί στο μπλοκ εκτός από. Ας υποθέσουμε ότι θέλουμε να αγνοήσουμε την εξαίρεση ValueError. Θα το κάνουμε με αυτόν τον τρόπο:
except ValueError: pass
Αν δεν γνωρίζετε τι κάνετε, είναι κακή πρακτική να αγνοείτε τις εξαιρέσεις. Τουλάχιστον, ενημερώστε τον χρήστη για όλα τα πιθανά σφάλματα.
συμπέρασμα
Σε αυτό το σεμινάριο, καλύψαμε: Python Exceptions, Traceback; πώς να χειριστείτε τις εξαιρέσεις με Δοκιμάστε / Εκτός / Αλλού / Τελικά μπλοκ, πώς να Υψώνω Εξαιρέσεις και τέλος πώς να δημιουργήσουμε τις δικές μας προσαρμοσμένες εξαιρέσεις.
Ευχαριστώ για την ανάγνωση!
=> Επισκεφθείτε εδώ για να μάθετε το Python From Scratch.
Συνιστώμενη ανάγνωση
- Εκμάθηση Python για αρχάριους (ΔΩΡΕΑΝ Κατάρτιση Python)
- Δηλώσεις ελέγχου Python (Python Continue, Break and Pass)
- Εκμάθηση Python DateTime με παραδείγματα
- Λειτουργίες συμβολοσειράς Python
- Μεταβλητές Python
- C # Εκπαιδευτικός χειρισμός εξαίρεσης με παραδείγματα κώδικα
- Πλήρης οδηγός για την εξαίρεση PL SQL με παραδείγματα
- Εξαιρέσεις Java και χειρισμός εξαιρέσεων με παραδείγματα