如果我只给这个函数一个参数,为什么异常处理不起作用?



这是一个函数:

def add(a, b):
try:
  return a + b
except TypeError:
  print('Error: It takes exactly 2 arguments')

这很好地运行:

print(add(5,2))

这不会打印我期望的消息:

print(add(5))

为什么?

您的消息不会打印,因为该功能从未被调用。

这是一个更简单的示例,不会试图捕获任何例外,以显示发生的事情:

# add_test.py
def add(a, b):
    return a + b

如果将其保存为模块add_test.py,然后从交互式python会话中导入它,则可以尝试一些内容:

>>> from add_test import add
>>> add(5, 2)
7

这是按预期工作的。

>>> add(5, 'x')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/z/add_test.py", line 4, in add
    return a + b
TypeError: unsupported operand type(s) for +: 'int' and 'str'

这将在add()函数内升高TypeError(在第4行,如上书所告诉您(,因为您无法将整数5和字符串'x'一起添加。

如果您愿意,可以捕获此例外并打印某种消息:

# add_test_2.py
def add_exc(a, b):
    try:
        return a + b
    except TypeError:
        print("cannot add %r and %r." % (a, b))

…它的行为将如预期:

>>> from add_test_2 import add_exc
>>> add_exc(5, 'x')
cannot add 5 and 'x'.

但是,当您完全错过论点时,会发生不同的事情:

>>> add(5)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: add() missing 1 required positional argument: 'b'

这立即升高TypeError,甚至没有尝试在add()中执行代码,因为当您定义add()时,您指定了这两个参数:ab。您的功能是说"我只能用两个参数来调用",所以Python遵循该规则。

由于您在第二个示例中还没有给python一个b的值有意义。

一种看待这一点的方法是,您在上面的两个示例中获得了两种不同类型的TypeError

  • 当您致电add(5, 'x')时,问题是5'x'是无法将其添加在一起的事物的类型,并且在打破该规则的确切时刻您会得到TypeError

  • 当您尝试调用add(5)时,问题是add()是一种必须用两个参数调用的函数,并且在折断的确切时刻获得了TypeError>规则,即函数甚至可以启动之前。

最新更新