Почему я получаю TypeError, если передаю только один аргумент? - PullRequest
0 голосов
/ 24 апреля 2020
def divide(num1,num2):
    try:
        return num1/num2
    except TypeError:
        return "Please provide two integers or floats"
    except ZeroDivisionError:
        return "Please do not divide by zero"

Ответы [ 3 ]

1 голос
/ 24 апреля 2020

Если вы не предоставите все необходимые аргументы, функция никогда не будет введена, поэтому нет способа поймать эту TypeError из внутри функции.

Для иллюстрации рассмотрим функцию, которая сразу выдает ошибку:

>>> def func(a, b, c):
...     raise Exception("inside the function")
...

Теперь давайте вызовем ее с необходимыми аргументами:

>>> func(1, 2, 3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in func
Exception: inside the function

Здесь вы можете видеть из трассировки (in func), что Функция была введена, и оттуда выдается ошибка. Однако, если мы вызовем его снова без аргументов:

>>> func()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: func() takes exactly 3 arguments (0 given)

Обратите внимание, что в трассировку не входит in func, ошибка происходит до входа в тело функции. Вы можете только поймать его за пределами функции:

>>> try:
...     func()
... except TypeError:
...     print('oh no!')
...
oh no!
0 голосов
/ 24 апреля 2020

Потому что ваш оператор try / exception перехватывает это исключение и возвращает указанное сообщение.

Попробуйте что-то вроде этого:

try:
   if num1 and num2:
      return num1 / num2
   else:
      return "Please provide two numbers"
except ZeroDivisionError:
   return "Please do not divide by zero"
except TypeError:
   return "Please provide two integers or floats"
0 голосов
/ 24 апреля 2020

Для позиционных параметров вы должны передать одинаковое количество аргументов. Вы можете использовать концепцию аргументов по умолчанию, например:

def divide(num1=1,num2=1):
    try:
        return num1/num2
    except TypeError:
        return "Please provide two integers or floats"
    except ZeroDivisionError:
        return "Please do not divide by zero"

Вы можете вызвать эту функцию, используя аргументы 0,1 или 2.

...