重新添加异常,以便在同一个块中处理

Mic*_*per 2 python exception-handling python-3.x

我的代码有点像这样:

try:
    # do stuff
except SomeSpecificException as sse:
    if sse.some_property == some_special_value:
        # handle the exception in a special way
    else:
        handle_exception_normally()
except:
    handle_exception_normally()
Run Code Online (Sandbox Code Playgroud)

我想捕获特定的异常并以特殊方式处理它,但前提是它具有特定属性.如果它没有该属性,我希望它像任何其他异常一样处理(记录,尖叫等)

上面的代码有效,但如果可能的话,我想避免重复handle_exception_normally()(DRY和所有这些).

只是放入第一个块raiseelse子句except不起作用.父try块会捕获它,但同一块中的catch-all子句不会.

我可以嵌套两个try街区,但它不是很优雅; 我宁愿只使用上面的代码.

有没有更好的办法?

请注意,我使用的是Python 3.

Fab*_*ien 5

我会选择:

try:
    # do stuff
except Exception as e:
    if e.args[0] == 'Discriminate Exception Here' and sse.some_property == some_special_value:
        # handle the exception in a special way
    else:
        handle_exception_normally()
Run Code Online (Sandbox Code Playgroud)

摩西·科莱多耶提出:

try:
    # do stuff
except Exception as e:
    if getattr(e, 'some_property', None) == some_special_value:
        # handle the exception in a special way
    else:
        handle_exception_normally()
Run Code Online (Sandbox Code Playgroud)

哪个更短但需要some_special_value始终!= None和属性对您的异常是唯一的.

例外歧视的例子,包括e.args[0]:

try:
 5 / 0
except Exception as e:
 print(e.args[0])

division by zero
Run Code Online (Sandbox Code Playgroud)

__class__.__name__:

try:
 5 / 0
except Exception as e:
 print(e.__class__.__name__)

ZeroDivisionError
Run Code Online (Sandbox Code Playgroud)

随着isinstance()(位更多的CPU):

try:
 5 / 0
except Exception as e:
 isinstance(e, ZeroDivisionError)

True
Run Code Online (Sandbox Code Playgroud)