python - Python try-except 块重新引发异常
问题描述
不捕获内部函数的异常而是在调用外部函数时这样做是不好的做法?让我们看两个例子:
选项 a)
def foo(a, b):
return a / b
def bar(a):
return foo(a, 0)
try:
bar(6)
except ZeroDivisionError:
print("Error!")
优点:更清洁(在我看来)
缺点:如果不查看,您无法分辨出哪些异常bar
正在引发foo
选项 b)
def foo(a, b):
return a / b
def bar(a):
try:
ret = foo(a, 0)
except ZeroDivisionError:
raise
return ret
try:
bar(6)
except ZeroDivisionError:
print("Error!")
优点:显式
缺点:您只是在编写一个重新引发异常的 try-except 块。在我看来也很丑
其他选择?
我知道,如果您想对异常执行某些操作或将多个异常组合在一起,则选项 b 是唯一的选择。但是,如果您只想按原样重新提出一些特定的例外情况怎么办?
我在 PEP 中找不到任何可以说明这一点的内容。
解决方案
如果您阅读鲍勃叔叔的清洁代码书,您应该始终将逻辑和错误处理分开。这将使选项 a.) 成为首选解决方案。
我个人喜欢这样命名函数:
def _foo(a, b):
return a / b
def try_foo(a, b):
try:
return _foo(a, b)
except ZeroDivisionError:
print('Error')
if __name__ == '__main__':
try_foo(5, 0)
推荐阅读
- angular - 角材料垫单元点击事件
- wordpress - 如何在 Wordpress 中更改子目录的名称
- c# - 如何在后面的代码中获取 itemtemplate 的图像?
- azure - 使用 OAuthCard 调用 Azure Function
- azure-cosmosdb - 从 Azure 文档数据库中的分区集合中的特定分区查询所有文档的最有效方法是什么?
- java - 在内存中创建 mdb 副本时出错
- mongodb - 只有一个复合索引字段的 MongoDB 查询
- django - Django根据条件计算相关对象
- node.js - AWS cloud9 无法创建新的 ssh 环境
- sql-server - 本月和上月购买商品的客户 ID