如何处理except子句中引发的异常

时间:2017-07-29 09:10:19

标签: python python-2.7 flask

考虑到你有这种烧瓶api的代码:

@app.route('/doing/foo')
def foo():
 try:
      ...
 except Exception as ex:
     doing some stuff

现在doing some stuff意外地抛出了另一个异常。如何防止服务器显示另一个通用内部服务器错误而不知道发生了什么? 换句话说,我如何捕获可能源自except clause

的异常

2 个答案:

答案 0 :(得分:2)

啊哈!这是一个100年的问题。

第一个选择是转到Python 3。

Python 3有异常链接并将打印两个异常 - 正在处理的异常和由于处理不当而抛出的异常。

第二个选项是自己实现异常链接:

使用当前try-except内的另一个except:子句手动将新异常注入正在处理的异常中。

请记住 WILL 会导致循环引用。由于它是一次性例外,我不打算处理它。进一步使用此方法需要使用traceback.clear_frames()清除回溯。

答案 1 :(得分:2)

在请求处理程序中,记录错误并返回HTTP 500错误和一些HTML,注意到发生了"内部错误"并包含一个回到某个安全点的链接,供用户重新启动他们正在做的事情。

您可以尝试捕获更具体的异常(从大多数特定和常见到 Exception (这是一般异常中最常见的)。您还可以尝试对异常/ traceback对象进行内省(在你的例子中 ex )。

大多数情况下,您只是希望确保不会通过浏览器向用户显示内部应用程序状态(可能存在安全隐患),并且您不要简单地删除用户的请求。地板上。