Исключение ошибки типа в Python

#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:")))

 

изменить: чтобы это сработало, вы также должны «импортировать систему»