Flask RestPlus:如何捕获所有异常并输出原始错误

Flask RestPlus: how to catch all exceptions and output the original error

我正在尝试捕获所有可能发生的异常并将堆栈详细信息作为 FlaskRestPlus 中的消息输出。

下面是一个在我引发自定义异常(例如 RootException 时有效的示例。但我没有设法让它与 BaseException 或任何其他可能作为包罗万象的东西一起工作。我也没有找到将堆栈(或原始错误消息)输出到消息正文中的方法。

@api.errorhandler(RootException)
def handle_root_exception(error):
    return {'message': 'Here I want the original error message'}, 500

如有任何建议,我将不胜感激。文档似乎并不完全清楚:https://flask-restplus.readthedocs.io/en/stable/errors.html

要创建通用错误处理程序,您可以使用:

@api.errorhandler(Exception)
def generic_exception_handler(e: Exception):

堆栈跟踪捕获

要自定义堆栈跟踪处理,请参阅 Python When I catch an exception, how do I get the type, file, and line number?

示例堆栈跟踪数据捕获

import sys

...

@api.errorhandler(Exception)
def generic_exception_handler(e: Exception):
    exc_type, exc_value, exc_traceback = sys.exc_info()

    if exc_traceback:
        traceback_details = {
            'filename': exc_traceback.tb_frame.f_code.co_filename,
            'lineno': exc_traceback.tb_lineno,
            'name': exc_traceback.tb_frame.f_code.co_name,
            'type': get_type_or_class_name(exc_type),
            'message': str(exc_value),
        }
        return {'message': traceback_details['message']}, 500
    else:
        return {'message': 'Internal Server Error'}, 500

函数 get_type_or_class_name 是一个帮助程序,它获取对象的类型名称,或者在 Class、returns 的情况下获取 Class 名称。

def get_type_or_class_name(var: Any) -> str:
    if type(var).__name__ == 'type':
        return var.__name__
    else:
        return type(var).__name__

也习惯提供一个HTTPException处理程序:

from werkzeug.exceptions import HTTPException

@api.errorhandler(HTTPException)
def http_exception_handler(e: HTTPException):