Folosim instrucțiunea „with” pentru a deschide și închide fișierele. [1][2]
with open("in_test.txt", "rt") as in_file:
with open("out_test.txt", "wt") as out_file:
text = in_file.read()
data = parse(text)
results = encode(data)
out_file.write(results)
print( "All done." )
Dacă se întâmplă vreun fel de eroare oriunde în acest cod (unul dintre fișiere este inaccesibil, funcția parse() se sufocă cu date corupte etc.), declarațiile „with” garantează că toate fișierele vor fi în cele din urmă închise corect. Închiderea unui fișier înseamnă doar că fișierul este „curățat” și „eliberat” de programul nostru, astfel încât să poată fi utilizat într-un alt program.
Găsirea erorilot cu try
Deci acum aveți programul perfect, rulează impecabil, cu excepția unui detaliu: se va bloca la intrarea nevalidă a utilizatorului. Nu vă temeți, deoarece Python are o structură de control specială pentru dvs. Se numește
și încearcă să facă ceva. Iată un exemplu de program cu o problemă:
try
print("Type Control C or -1 to exit")
number = 1
while number != -1:
number = int(input("Enter a number: "))
print("You entered:", number)
Observați cum când introduceți @#& iese ceva de genul:
Traceback (most recent call last): File "try_less.py", line 4, in <module> number = int(input("Enter a number: ")) ValueError: invalid literal for int() with base 10: '\\@#&'
După cum puteți vedea, funcția int()
este nemulțumită de numărul @#&
(așa cum ar și trebui să fie). Ultima linie arată care este problema; Python a găsit o ValueError
. Cum poate programul nostru să facă față acestui lucru? Ceea ce facem este mai întâi: să punem locul unde pot apărea erori într-un bloc try
și, în al doilea rând: să spunem lui Python cum vrem să fie tratată ValueError
s. Următorul program face acest lucru:
print("Type Control C or -1 to exit")
number = 1
while number != -1:
try:
number = int(input("Enter a number: "))
print("You entered:", number)
except ValueError:
print("That was not a number.")
Acum, când rulăm noul program și îi dăm @#&
, ne spune „Acesta nu a fost un număr”. și continuă cu ceea ce făcea înainte.
Când programul dvs. continuă să aibă o eroare pe care știți cum să o gestionați, puneți codul într-un bloc try
și puneți modalitatea de a gestiona eroarea în blocul except
.
Exerciții
Actualizați cel puțin programul de numere de telefon (în secțiunea Dicționare) pentru ca acesta să nu se blocheze dacă un utilizator nu introduce date în meniu.
Soluţie
def print_menu():
print('1. Print Phone Numbers')
print('2. Add a Phone Number')
print('3. Remove a Phone Number')
print('4. Lookup a Phone Number')
print('5. Quit')
print()
numbers = {}
menu_choice = 0
print_menu()
while menu_choice != 5:
try:
menu_choice = int(input("Type in a number (1-5): "))
if menu_choice == 1:
print("Telephone Numbers:")
for x in numbers.keys():
print("Name: ", x, "\tNumber:", numbers[x])
print()
elif menu_choice == 2:
print("Add Name and Number")
name = input("Name: ")
phone = input("Number: ")
numbers[name] = phone
elif menu_choice == 3:
print("Remove Name and Number")
name = input("Name: ")
if name in numbers:
del numbers[name]
else:
print(name, "was not found")
elif menu_choice == 4:
print("Lookup Number")
name = input("Name: ")
if name in numbers:
print("The number is", numbers[name])
else:
print(name, "was not found")
elif menu_choice != 5:
print_menu()
except ValueError:
print("That was not a number.")
(Include texte din Wikibooks traduse și adaptate de Nicolae Sfetcu)
Lasă un răspuns