分配给sys.excepthook并不起作用:在mod_wsgi中处理未捕获的异常

时间:2015-02-17 20:28:08

标签: python mod-wsgi wsgi

我希望在我的wsgi应用程序中出现未被捕获的异常时生成一个http响应状态为“200 OK”的html页面,而不是Web服务器对此类情况的标准“500内部服务器错误”响应。为了测试这个功能,我做了以下示例代码:

import sys

def application(environ, start_response):
    def exception(etype, evalue, trace):
        start_response('200 OK', [('Content-Type', 'text/plain')])
        return ['Error']

    sys.excepthook = exception

    1/0

    start_response('200 OK', [('Content-Type', 'text/plain')])
    return ['OK'] 

但是从不调用函数'exception',并且在未捕获异常的情况下服务器仍然会生成标准的“500 Internal Server Error”响应。

是否有可能通过尝试创建一个未被捕获的钩子...除了mod_wsgi下的异常以某种方式?

1 个答案:

答案 0 :(得分:0)

我刚刚意识到,绕过可以实现我需要的目标而无需重新定义sys.excepthook:

def actual_application(environ, start_response):
    # Real WSGI application goes here
    start_response('200 OK', [('Content-Type', 'text/plain')])
    return ['OK']

def error(environ, start_response):
    # Format a trace and a debug info to send it to a browser here
    start_response('200 OK', [('Content-Type', 'text/plain')])
    return ['Error']

def application(environ, start_response):
    # And the mod_wsgi application hook should consist of the only try...except block
    try:
        return actual_application(environ, start_response)
    except:
        return error(environ, start_response)