这是一个函数:
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()
时,您指定了这两个参数:a
和b
。您的功能是说"我只能用两个参数来调用",所以Python遵循该规则。
由于您在第二个示例中还没有给python一个b
的值有意义。
一种看待这一点的方法是,您在上面的两个示例中获得了两种不同类型的TypeError
:
当您致电
add(5, 'x')
时,问题是5
和'x'
是无法将其添加在一起的事物的类型,并且在打破该规则的确切时刻您会得到TypeError
。当您尝试调用
add(5)
时,问题是add()
是一种必须用两个参数调用的函数,并且在折断的确切时刻获得了TypeError
>规则,即函数甚至可以启动之前。