如果我只给这个函数一个参数,为什么没有异常处理工作呢?

时间:2017-05-03 05:59:47

标签: python python-3.x

这是一个功能:

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

这完美运行:

print(add(5,2))

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

print(add(5))

为什么?

1 个答案:

答案 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)打破 规则的确切时刻,该规则在函数甚至可以开始之前。