【问题标题】:How to handle exception raised in except clause如何处理except子句中引发的异常
【发布时间】:2017-07-29 09:10:19
【问题描述】:
假设你有这样的烧瓶 api 代码:
@app.route('/doing/foo')
def foo():
try:
...
except Exception as ex:
doing some stuff
现在doing some stuff 不小心抛出了另一个异常。在不知道发生了什么的情况下,如何防止服务器显示另一个通用的内部服务器错误?
换句话说,我如何捕获可能源自except clause 的异常?
【问题讨论】:
标签:
python
python-2.7
flask
【解决方案1】:
啊哈!这是一个 100 年的问题。
第一个选择是迁移到 Python 3。
Python 3 具有异常链接,并将打印两个异常 - 正在处理的异常和由于处理不当而引发的异常。
第二种选择是自己实现异常链:
使用当前except: 中的另一个try-except 子句将新异常手动注入正在处理的异常中。
请记住它会导致循环引用。由于这是一次性例外,我不会费心处理它。进一步使用此方法需要使用traceback.clear_frames() 清理回溯。
【解决方案2】:
在请求处理程序中,记录错误并返回 HTTP 500 错误和一些 HTML,指出“发生了内部错误”并包含返回某个安全点的链接,以便用户重新启动他们正在执行的操作。
您可以尝试捕获更具体的异常(从最具体和常见的到 Exception(这是最一般的一般异常)。您还可以尝试对异常/回溯对象进行内省(ex 在你的例子中)。
大多数情况下,您只是想确保您不会通过用户的浏览器向用户显示内部应用程序状态(可能存在安全隐患),并且您不会简单地将用户的请求丢弃在地板上。