Cześć drodzy pasjonaci. Mam do Was pytanie odnośnie zabezpieczania programów przed wprowadzeniem przez użytkownika tzw ,,Invalid Input" w postaci string, co skutkuje ValueErrorem i wykrzaczeniem programu, w sytuacji kiedy program wymaga wprowadzenie np: zmiennych typu INT. Szczególnie w przypadkach gdy program ma dalej coś policzyć na podstawie zmiennych int. Poniżej wkleiłem 2 krótkie kody gdzie starałem się wymyślić jak uniknąć ,,crashu" na skutek błędnego wprowadzenia zmiennej string.
Czy istnieje możliwość zabezpieczenia programu tylko za pomocą komend try: / except, bez konieczności wprowadzania jakiejś dodatkowej ,,logiki zabezpieczającej w postaci IFów lub/i pętli.
1. To program który losuje liczbę od 1-100 i daje 5 szans na odgadnięcie. Pomimo, że zabezpieczyłem try/except przy wprowadzaniu zmiennych to i tak mi go wywalało gdy program dochodził do momentu określenia czy liczba jest większa / mniejsza od wprowadzonej ( if x > num:). Dodałem więc ifa na sprawdzenie typu zmiennej (chyba to tak działa) no i nie wykrzacza się. Jednak mam wątpliwości czy jest to rozwiązanie optymalne i czy nie da się tego zrobić samym try / except ?
x = random.randint(1,100)
num = ""
chance = 0
while x != num and chance != 5:
chance += 1
chan_rate = 5 - chance
try:
num = int(input("Wprowadz liczbę: "))
except ValueError as err:
print("Wprowadź liczbę!", err)
if x == num:
print ("BRAWO WYGRYWASZ !!!")
break
if chance < 5:
print("Dostępne Szanse: {}" .format(chan_rate))
if num:
if x > num:
print("Wylosowana Liczba jest większa. Próbuj dalej.")
else:
print("Wylosowana liczba jest mniejsza. Próbuj dalej.")
elif not num:
print("Podaj liczbę całkowitą! - ValueError.")
else:
print("BRAK SZANS.")
if x != num:
print("PRZEGRANA !!! Komputer wylosowal: {}" . format (x))
2 program na spełnianie warunków budowy trójkąta / wyznaczenie trójkąta pitagorejskiego. Tutaj z try / except mi kompletnie nie wychodziło, bo z racji tego ze są 3 zmienne to program zawsze sie gdzieś wykrzaczył, a nawet jak nie to zamykał się po wyświetleniu komunikatu błędu, bez poproszenia o kolejny Input. Zbudowałem więc taką pętle while i teoretycznie działa. Znów rodzi się pytanie czy to nie powinno być zrobione samym try / exceptem.
a = ""
b = ""
c = ""
while not a or not b or not c:
try:
a = int(input("Podaj bok pierwszy: "))
b = int(input("Podaj bok drugi: "))
c = int(input("Podaj bok trzeci: "))
except ValueError as err:
print("Wprowadzaj TYLKO liczby CAŁKOWITE!")
if c < a: # mozna to zrobic tez ze zmienną. ('temp')
c,a = a,c
if c < b:
c,b = b,c
if b < a:
b,a = a,b
print (a , b, c)
if (a + b > c):
print("Trójkąt jest mozliwy")
trigle = True
else:
print("Z tych bokow NIE bedzie Trójkąta")
trigle = False
if (trigle and a**2 + b**2 == c**2):
print("Trójkąt Pitagorejski.")
if ( a/3 == b/4 == c/5):
print("Trójkąt Egipski")
elif(trigle):
print("Trójkąt NIE Pitagorejski"
PS. Przepraszam za długi wątek ale staram się uczyć kodowania z przyzwoitymi standardami i zabezpieczać programy przed crashem w taki sposób jak przychodzi mi to do głowy.
Pozdrawiam i dzięki za wyrozumiałość.