Home » Articole » Articole » Calculatoare » Programare » Python » Python: Confruntarea cu imperfectul… sau cum să gestionați erorile de închidere a fișierelor cu ”with”

Python: Confruntarea cu imperfectul… sau cum să gestionați erorile de închidere a fișierelor cu ”with”

postat în: Python 0

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
try
și încearcă să facă ceva. Iată un exemplu de program cu o problemă:


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ă ValueErrors. 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.")
[1] „The ‘with’ statement”

[2] ‘The Python „with” Statement by Example’

(Include texte din Wikibooks traduse și adaptate de Nicolae Sfetcu)

Amenințările persistente avansate în securitatea cibernetică – Războiul cibernetic
Amenințările persistente avansate în securitatea cibernetică – Războiul cibernetic

Această carte esențială servește atât ca analiză detaliată, cât și ca un apel la acțiune pentru oricine este implicat în domeniul securității digitale.

Nu a fost votat Interval de prețuri: 9.48 lei până la 29.88 lei Selectează opțiunile Acest produs are mai multe variații. Opțiunile pot fi alese în pagina produsului.
Ghidul autorului de cărţi electronice
Ghidul autorului de cărţi electronice

Descoperă cum să devii autor de succes în era digitală!

Nu a fost votat 23.78 lei Selectează opțiunile Acest produs are mai multe variații. Opțiunile pot fi alese în pagina produsului.


Descoperă mai multe la MultiMedia

Abonează-te ca să primești ultimele articole prin email.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *