Python 2支持以下语法用于raise
:
raise FooException(bar) # call
raise FooException, bar # positional
我认为位置语法只是旧版Python支持将任意值作为异常处理的历史结果。
使用位置语法有哪些用例是无法使用调用语法(或更冗长)实现的?
Python 2支持以下语法用于raise
:
raise FooException(bar) # call
raise FooException, bar # positional
我认为位置语法只是旧版Python支持将任意值作为异常处理的历史结果。
使用位置语法有哪些用例是无法使用调用语法(或更冗长)实现的?
我在我的答案中回答了问题的编辑版本,主要是
然而,即使是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.args
,raise ValueError
也是如此。
这甚至适用于多个对象。在这种情况下,我们将得到一个相同长度的元组:
try:
raise ValueError(1, 2, 3, 4)
except ValueError as e:
print(e.args)
# (1, 2, 3, 4)