Εισαγωγή Εξαιρέσεις ηµήτρης Λεβεντέας 20 Μαΐου 2010
Εισαγωγή Ορισµός Τι είναι Ορισµός Ο χειρισµός εξαιρέσεων είναι µια κατασκευή η οποία µας επιτρέπει να χειριστούµε ειδικές συνθήκες που αλλάζουν την ϕυσιολογική ϱοή του προγράµµατος.
Εισαγωγή Χαρακτηριστικά Μηχανισµός Αν κάτι πάει στραβά η Python εγείρει µια εξαίρεση. Την αναγνωρίζουµε (πχ NameError, TypeError, IndexError). Εκτελούµε ειδικό κώδικα για αυτή την περίπτωση. Αν δεν χειριστούµε µια εξαίρεση που εγείρεται, τότε το πρόγραµµα µας σταµατάει την εκτέλεση του. Εξαιρέσεις που δεν έχουν χειριστεί, εµφανίζονται στο traceback. Μας ενηµερώνει τι ακριβώς συνέβει.
Εισαγωγή ιαίρεση µε το µηδέν >>> 8/ 0 Traceback ( most recent c a l l l a s t ) : F i l e " < s t d i n > ", l i n e 1, i n <module> Z e r o D i v i s i o n E r r o r : i n t d i v i s i o n or modulo by zero
Εισαγωγή ιαίρεση µε το µηδέν (χειρισµός) >>> t r y :... 8/0... except Z e r o D i v i s i o n E r r o r :... p r i n t ( ' Could not make the d i v i s i o n ' )... Could not make the d i v i s i o n
Εισαγωγή Μη ορισµένη µεταβλητή >>> a * 5 Traceback ( most recent c a l l l a s t ) : F i l e " < s t d i n > ", l i n e 1, i n <module> NameError : name 'a ' i s not defined
Εισαγωγή Μη δυνατή πράξη >>> b = None >>> b * 7 Traceback ( most recent c a l l l a s t ) : F i l e " < s t d i n > ", l i n e 1, i n <module> T y p e E r r o r : unsupported operand type ( s ) f o r * : ' NoneType ' and ' i n t '
Εισαγωγή Μη υπαρκτό αρχείο >>> w ith open ( ' 3 B i r d s A r e S i t t i n g. mp3 ', ' r ' ) as f :... f. read ( )... Traceback ( most recent c a l l l a s t ) : F i l e " < s t d i n > ", l i n e 1, i n <module> I O E r r o r : [ E r r n o 2] No such f i l e or d i r e c t o r y : ' 3 B i r d s A r e S i t t i n g. mp3 '
Εισαγωγή Είσοδος από Χρήστη while True : t r y : x = i n t ( i n p u t ( " Please enter a number : " ) ) break except V a l u e E r r o r : p r i n t ( " Not a number. T r y again... " ) p r i n t ( x )
Εισαγωγή Ολα σε ένα... except ( R u n t i m e E r r o r, T y p e E r r o r, NameError ) :... pass
Εισαγωγή Στην τελική... (except:) import s y s t r y : f = open ( ' m y f i l e. t x t ' ) s = f. r e a d l i n e ( ) i = i n t ( s. s t r i p ( ) ) except I O E r r o r as e r r : p r i n t ( " I /O e r r o r : { } ". format ( e r r ) ) except V a l u e E r r o r : p r i n t ( " Could not convert data to an i n t e g e r. " ) except : p r i n t ( " Unexpected e r r o r : ", s y s. e x c _ i n f o ( ) [ 0 ] ) r a i s e
Γενικά Μηχανισµός 1 Οι δηλώσεις του try µπλοκ εκτελούνται. 2 Αν καµία εξαίρεση δεν συµβεί, δεν εκτελείται το µπλοκ του except. 3 Μόλις συµβεί µια εξαίρεση στο try µπλοκ, σταµατάει η εκτέλεση του και πάµε στο except. 4 Ψάχνουµε για except µπλοκ του συγκεκριµένου τύπου εξαίρεσης. 5 Αν ϐρεθεί, εκτελούνται οι δηλώσεις του. 6 Αν δεν ϐρεθεί, η εξαίρεση περνάει στο εξωτερικό try µπλοκ. 7 Αν η εξαίρεση δεν χειριστεί καθόλου, σταµατάει η εκτέλεση του προγράµµατος.
Κανόνες Κανόνες 1 Χρήση της δοµής του µηχανισµού εξαιρέσεων µόνο για πράγµατα που αλλάζουν απροσδόκητα την ϱοή προγράµµατος. 2 Ελάχιστος κώδικας µέσα σε κάθε try µπλοκ.
Κανόνες Κανόνες 1 Χρήση της δοµής του µηχανισµού εξαιρέσεων µόνο για πράγµατα που αλλάζουν απροσδόκητα την ϱοή προγράµµατος. 2 Ελάχιστος κώδικας µέσα σε κάθε try µπλοκ.
try:... else:... t r y : f = open ( ' m y f i l e. t x t ' ) except I O E r r o r as e r r : p r i n t ( " I /O e r r o r : { } ". format ( e r r ) ) else : s = f. r e a d l i n e ( ) p r i n t ( ' The f i r s t l i n e of f i s : ', s ) f. close ( )
Τι συµβαίνει 1 Εκτελείται ο κώδικας µέσα στο µπλοκ try. 2 Αν συµβεί εξαίρεση µεταφερόµαστε στο µπλοκ except. 3 Αλλιώς (αν δεν συµβεί εξαίρεση) πηγαίνουµε στο µπλοκ else. 4 Πρέπει να είναι µετά από όλα τα µπλοκ except.
finally # how many t i m e s we have requested f o r i n p u t t i m e s = 0 while True : t r y : x = i n t ( i n p u t ( " Please enter a number : " ) ) break except V a l u e E r r o r : p r i n t ( " Not a number. T r y again... " ) f i n a l l y : t i m e s += 1 p r i n t ( ' Requested i n p u t ', t i m e s )
Τι συµβαίνει 1 Ο,τι και να γίνει (συµβεί εξαίρεση ή όχι) εκτελείται ο κώδικας στο finally. 2 Χρήσιµο όταν ϑέλουµε να απελευθερώσουµε πόρους, ανεξάρτητα από το αν χρησιµοποιήθηκαν επιτυχώς ή όχι.
Ορίσµατα Εξαιρέσεων t r y : r a i s e Exception ( 'Can you handle i t? ' ) except Exception as i n s t : p r i n t ( i n s t. args ) p r i n t ( i n s t )
Τι συµβαίνει 1 Είναι ορίσµατα που περιγράφουν τι ακριβώς έγινε µε την εξαίρεση. 2 Οι εξαιρέσεις κληρονοµούν από µια κλάση (Exception). 3 Αυτή η κλάση παρέχει το args στα στιγµυότυπα της όπου υπάρχουν τα ορίσµατα της εξαίρεσης. 4 Παρέχεται και η µέθοδος str () ώστε να µπορούµε να τα τυπώνουµε απευθείας.
Εγείροντας Εξαιρέσεις >>> r a i s e NameError ( ' T e s s e r a P o u l a k i a K a 8 o n t a i ' ) Traceback ( most recent c a l l l a s t ) : F i l e " < s t d i n > ", l i n e 1, i n <module> NameError : T e s s e r a P o u l a k i a K a 8 o n t a i
Εγείροντας Εξαιρέσεις (2) >>> r a i s e NameError Traceback ( most recent c a l l l a s t ) : F i l e " < s t d i n > ", l i n e 1, i n <module> NameError
Τι συµβαίνει 1 Με την raise µπορούµε να εγείρουµε µια εξαίρεση. 2 Η εξαίρεση µπορεί να είναι ένα στιγµυότυπο ή µια κλάση εξαιρέσεων. 3 Σηµαντικό: Θεωρητικά, κάθε κλάση πρέπει να είναι υποκλάση της BaseException. 4 Πρακτικά, κάθε κλάση πρέπει να είναι υποκλάση της Exception.
ικές µας εξαιρέσεις >>> c l a s s MyError ( Exception ) :... def i n i t ( s e l f, value ) :... s e l f. value = value... def s t r ( s e l f ) :... r e t u r n r e p r ( s e l f. value )
ικές µας εξαιρέσεις (2) >>> t r y :... r a i s e MyError ( 4 )... except MyError as e :... p r i n t ( 'My exception occurred : ', e )... My exception occurred : 4
ικές µας εξαιρέσεις (3) >>> r a i s e MyError ( ' oops! ' ) Traceback ( most recent c a l l l a s t ) : F i l e " < s t d i n > ", l i n e 1, i n? main. MyError : ' oops! '
Επίλογος Ευχαριστώ