#python #error-handling
Вопрос:
Я новичок в python, и на этой неделе мы начали с ООП. Программа, которую я в настоящее время выполняю, вычисляет площадь прямоугольника, и я обработал большую часть кода, за исключением того, где программе необходимо отклонить ввод и выход с плавающей точкой.
Вот мой код:
le = eval(input("Length:"))
wi = eval(input("Width:"))
def Rec(l, w):
if l < 0 and w < 0:
raise ValueError
total = l * w
return total
i = True
while i:
try:
print("Area:", Rec(le, wi))
i = False
except ValueError:
print("Input is negative!")
i = False
except TypeError:
print("The number is not an integer!")
i = False
else:
break
Комментарии:
1. либо принимайте входные данные как int
try: le = int(input("Length:"))
, либо вы можете использовать isinstance()if isinstance(le,float):
2.
eval(input(...))
это очень плохая практика. Если вы нашли это в учебнике, лучшим советом было бы отказаться от него и вместо этого использовать хороший.3. @ThierryLathuille на самом деле этому нас научил наш профессор, так что я не знал, что это плохая практика… Я буду иметь это в виду. Спасибо!
Ответ №1:
Вы можете проверить тип ввода. Попробуй это:
le = eval(input("Length:"))
wi = eval(input("Width:"))
import math
class Rec():
def __init__(self, l, w):
self.le = l
self.wi = w
def area(self):
if self.le < 0 or self.wi < 0:
raise ValueError
elif type(self.le) is float or type(self.wi) is float:
raise TypeError
else:
return self.le * self.wi
i = True
while i:
try:
total = Rec(le, wi)
print("Area:", total.area())
i = False
except ValueError:
print("Input is negative!")
i = False
except TypeError:
print("The number is not an integer!")
i = False
else:
break
Вы также можете использовать isinstance
вместо type
замены чека на:
elif isinstance(self.le,float) or isinstance(self.wi,float):
Также вы должны проверить, являются ли длина или ширина отрицательными, or
вместо «и«», так как оба измерения должны быть положительными.
Комментарии:
1. Спасибо! Я сделаю это и обновлю свой код!
2. Также используйте
is
вместо==
при проверке типа, так как типы являются синглетами
Ответ №2:
Вы могли бы завернуть ввод в чек, вот так:
def checkinput(x):
if(isinstance(x, int)):
return x
else:
print('Input a non decimal number like 1,2.. n.')
sys.exit(1) #exit with error code
le = checkinput(eval(input("Length:")))
wi = checkinput(eval(input("Width:")))
изменить: чтобы это сработало, вы также должны «импортировать систему»