Αντιμετωπιζοντας τις ατέλειες (ή διορθωνοντας τα λαθη)

Φανταστειτε οτι εχετε το τελειο πρόγραμμα που τρέχει άψογα εκτος απο μια περιπτωση. Καταρεει οταν ο χρηστης δωσει μη έγκυρα δεδομένα. Μην φοβαστε πια, γιατι η 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.

Ασκησεις

Ξαναγραψτε την τελετυταια έκδοση του προγραμματος τηλεφωνικων αριθμων έτσι ωστε το προγραμμα να μην καταρρέει οταν ο χρηστης δεν εισαγει καθολου δεδομένα στο μενου.