python - 重新引发异常,以便在同一 block 中处理它

标签 python python-3.x exception

我的代码有点像这样:

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()

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

上面的代码可以工作,但如果可能的话,我想避免重复handle_exception_normally()(DRY等等)。

仅将 raise 放在第一个 except block 的 else 子句中是行不通的。父 try block 会捕获该情况,但同一 block 中的 catch-all 子句不会。

我可以嵌套两个 try block ,但这不是很优雅;我宁愿只用 我上面的代码。

有更好的方法吗?

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

最佳答案

我会选择:

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()

Moses Koledoye建议:

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()

它更短,但要求 some_special_value 始终为 != None 并且属性对于您的异常是唯一的。

异常辨别示例,使用e.args[0]:

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

division by zero

使用__class__.__name__:

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

ZeroDivisionError

使用 isinstance() (CPU 密集程度更高):

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

True

关于python - 重新引发异常,以便在同一 block 中处理它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45109971/

相关文章:

python - 如何在Kafka中发布字典?

git - 如何解决这个问题,在执行 merge 命令期间捕获异常。 org.eclipse.jgit.errors.MissingObjectException :

python - biopython 的 efetch 仅返回任何数据库中的第一个特征

python - Pymysql 语法错误,我不明白

python - 如何使用 Python 将 zip 文件从一个文件夹复制到另一个文件夹

python - 如何通过单击 PySimpleGUI 中的按钮添加字段或元素?

python - 将递归与循环相结合以找到最大值

java - 对逻辑使用异常是一种不好的做法吗

.net - 堆栈溢出异常

python - 为什么所有列表元素中的值都重复?