Φανταστειτε οτι εχετε το τελειο πρόγραμμα που τρέχει άψογα εκτος απο μια περιπτωση. Καταρεει οταν ο χρηστης δωσει μη έγκυρα δεδομένα.
Μην φοβαστε πια, γιατι η Python έχει μια ειδικη δομη ελεγχου. Λεγεται try
και δοκιμαζει να κάνει κάτι.
Να ενα παράδειγμα ενος προγραμματος που έχει αυτό το προβλημα:
print "Type Control C or -1 to exit" number = 1 while number != -1: number = int(raw_input("Enter a number: ")) print "You entered: ",number
Προσεξτε πως οταν εισαγετε @#&
ανταποκρινεται κάπως ετσι:
Traceback (innermost last): File "try_less.py", line 4, in ? number = int(raw_input("Enter a number: ")) ValueError: invalid literal for int(): @#&
Οπως βλεπετε η συνάρτηση int
αντιδρά στον αριθμο @#&
(και έτσι θα 'πρεπε).
Η τελευταία γραμμη μας λεει ποιο είναι το προβλημα: Η Python βρηκε μια λάθος (ακαταλληλη) τιμη (ValueError
).
Πως μπορει το προγραμμά μας να αντιμετωπισει μια τετοια αντιδραση; Πρωτα θα κάνουμε το εξής: βαζουμε το κομμάτι οπου συμβαινει το σφαλμα
σ' ένα μπλοκ try
και δευτερον: λεμε στην Python τον τρόπο με τον οποιο θέλουμε να χειριστει το ValueError
Το πρόγραμμα στο ακολουθο παραδειγμα κάνει ακριβως αυτο:
print "Type Control C or -1 to exit" number = 1 while number != -1: try: number = int(raw_input("Enter a number: ")) print "You entered: ",number except ValueError: print "That was not a number."
Τώρα αν τρεξουμε το βελτιωμένο πρόγραμμα και δώσουμε @#&
θα μας απαντησει ``That was not a number.'' και θα
συνεχισει με ο,τι εκανε προηγουμένως.
Οταν κάποο προγραμμα σας εξακολουθει να έχει σφαλματα που μπορείτε να χειριστειτε, βαλτε σε ένα μπλοκ try
τον παθογενη κωδικα,
και δωστε τον τροπο που θα αντιμετωπιζονται σε ένα μπλοκ except
.
Ξαναγραψτε την τελετυταια έκδοση του προγραμματος τηλεφωνικων αριθμων έτσι ωστε το προγραμμα να μην καταρρέει οταν ο χρηστης δεν εισαγει καθολου δεδομένα στο μενου.