我如何在 Python 中引发异常以便稍后可以通过 except
块捕获?
原文由 TIMEX 发布,翻译遵循 CC BY-SA 4.0 许可协议
我如何在 Python 中引发异常以便稍后可以通过 except
块捕获?
原文由 TIMEX 发布,翻译遵循 CC BY-SA 4.0 许可协议
_不要这样做_。养一个裸体
Exception
绝对 不是 正确的做法;请参阅 Aaron Hall 的出色回答。
没有比这更 Pythonic 的了:
raise Exception("I know Python!")
将 Exception
替换为您要抛出的特定异常类型。
如果您需要更多信息,请参阅 Python 的 raise 语句文档。
原文由 Gabriel Hurley 发布,翻译遵循 CC BY-SA 4.0 许可协议
2 回答5.2k 阅读✓ 已解决
2 回答1.1k 阅读✓ 已解决
4 回答1.4k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
3 回答1.2k 阅读✓ 已解决
1 回答1.7k 阅读✓ 已解决
1 回答1.3k 阅读✓ 已解决
使用语义上适合您的问题的最具体的异常构造函数。
在您的消息中具体说明,例如:
不要引发一般异常
避免提出通用的
Exception
。要捕获它,您必须捕获所有其他将它子类化的更具体的异常。问题 1:隐藏错误
例如:
问题二:抓不住
更具体的捕获不会捕获一般异常:
最佳实践:
raise
声明相反,使用语义上适合您的问题的最具体的异常构造函数。
这也方便地允许将任意数量的参数传递给构造函数:
这些参数由
Exception
args
属性访问。例如:印刷
在 Python 2.5 中,一个实际的
message
属性被添加到BaseException
以鼓励用户子类化异常并停止使用args
message
args 的原始弃用已被收回。最佳实践:
except
条款例如,在 except 子句中时,您可能想要记录发生的特定类型的错误,然后重新引发。在保留堆栈跟踪的同时执行此操作的最佳方法是使用裸 raise 语句。例如:
不要修改你的错误……但如果你坚持。
您可以使用
sys.exc_info()
保留堆栈跟踪(和错误值),但这 更容易出错 并且 在 Python 2 和 3 之间存在兼容性问题,更喜欢使用裸raise
来重新-增加。解释一下
sys.exc_info()
返回类型、值和回溯。这是 Python 2 中的语法——注意这与 Python 3 不兼容:
如果你愿意,你可以修改你的新加薪会发生什么 - 例如设置 new
args
例如:我们在修改参数时保留了整个回溯。请注意,这 不是最佳实践,它在 Python 3 中是 无效语法(使得保持兼容性更难解决)。
在 Python 3 中:
再次重申:避免手动操作回溯。它 效率较低 且更容易出错。如果您使用线程和
sys.exc_info
您甚至可能得到错误的回溯(特别是如果您使用异常处理来控制流——我个人倾向于避免这种情况。)Python 3,异常链
在 Python 3 中,您可以链接异常,从而保留回溯:
意识到:
弃用的方法:
这些可以很容易地隐藏甚至进入生产代码。您想引发异常,而这样做会引发异常, 但不是预期的异常!
以下内容 在 Python 2 中有效,但在 Python 3 中无效:
仅 在更旧版本的 Python (2.4 及更低版本)中有效,您可能仍会看到人们提出字符串:
在所有现代版本中,这实际上会引发
TypeError
,因为您没有引发BaseException
类型。如果您没有检查正确的异常并且没有了解该问题的审阅者,它可能会投入生产。用法示例
如果消费者使用我的 API 不正确,我会引发异常以警告他们:
适当时创建自己的错误类型
你可以创建自己的错误类型,如果你想指出你的应用程序有什么特定的错误,只需在异常层次结构中子类化适当的点:
和用法: