Python中raise foo,bar有哪些用例?

3

Python 2支持以下语法用于raise

raise FooException(bar) # call
raise FooException, bar # positional

我认为位置语法只是旧版Python支持将任意值作为异常处理的历史结果。

使用位置语法有哪些用例是无法使用调用语法(或更冗长)实现的?


3
然而,即使是 Python 3 仍然支持它。但 Python 3.4 不支持,这是 Python 2 时代的遗留问题。 - DeepSpace
1
我相信在Python 3.6中,raise Foo是raise Foo()的语法糖。 - Denziloe
@khelwood 公正的观点。我已经删除了raise FooException的引用 - 我同意问题之前有些混乱。 - Wilfred Hughes
1
@WilfredHughes 我恐怕还是有点模糊。 “使用位置语法是否有任何用例无法使用(或更冗长)的调用语法?” 不,因为位置语法不再受支持。 - DeepSpace
@DeepSpace 在 Python 2 上,位置语法仍然存在,我想知道它是否有任何用例。这清楚吗? - Wilfred Hughes
显示剩余2条评论
1个回答

0

我在我的答案中回答了问题的编辑版本,主要是

然而,即使是Python 3也认为raise Foo()和raise Foo是等价的。

"调用"语法(raise Foo(obj))将任意对象obj分配给异常对象的args元组属性。虽然任何对象都可以用作obj,但这主要用于自定义字符串:

try:
    raise ValueError('a custom string')
except ValueError as e:
    print(e.args[0])
    # 'a custom string'
    print(e.args)
    # ('a custom string',)

args元组实际上在打印异常对象时使用,因此对于日志记录非常方便:

 try:
     raise ValueError('custom error', 2)
except ValueError as e:
    print(e)
    # ('custom error', 2)

raise ValueError() 将一个空元组分配给 exc_obj.argsraise ValueError 也是如此。

这甚至适用于多个对象。在这种情况下,我们将得到一个相同长度的元组:

try:
    raise ValueError(1, 2, 3, 4)
except ValueError as e:
    print(e.args)
    # (1, 2, 3, 4)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接