这是一个功能:
def add(a, b):
try:
return a + b
except TypeError:
print('Error: It takes exactly 2 arguments')
这完美运行:
print(add(5,2))
这不会打印我期望的消息:
print(add(5))
为什么?
答案 0 :(得分:2)
您的信息无法打印,因为该功能从未被调用过。
这是一个更简单的例子,它没有尝试捕捉任何例外情况,以显示正在发生的事情:
# 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'
这会在TypeError
函数中引发add()
(在第4行,正如上面的回溯告诉你的那样),因为你不能添加整数5
和字符串{ {1}}一起。
如果您愿意,可以捕获此异常并打印某种消息:
'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
。你的功能是说&#34;我只能用两个参数&#34;来调用,所以Python遵循这条规则。
由于你在第二个例子中没有为b
赋予Python值,所以如果调用它,函数根本就没有任何意义,并且Python知道,所以它拒绝尝试做一些没有任何意义的事情。
一种看待这种情况的方法是,您在上面的两个示例中获得了两种不同的b
:
当您致电TypeError
时,问题是add(5, 'x')
和5
是不能加在一起的事物类型,而您获得{{1}在你违反规则的那一刻。
当您尝试调用'x'
时,问题是TypeError
是一种必须使用两个参数调用的函数,并且您获得了add(5)
打破 规则的确切时刻,该规则在函数甚至可以开始之前。