Jinja 扩展中的优雅错误处理和日志记录

Graceful error handling and logging in Jinja extension

我正在开发一个 Jinja 扩展,它执行一些可能有害的操作,失败时会引发一个异常,该异常包含一些关于错误原因的信息。

发生这种情况时,异常当然会阻止 Jinja 完成其渲染过程和 return None 而不是渲染结果。使用 try/catch 语句和 returning 空字符串或任何合适的内容可以轻松缓解此问题。

但是,这有效地丢弃了异常和调试信息,我宁愿将其传递到我的错误日志中。负责设置 Jinja 环境的系统有它自己的日志服务,我希望它与扩展保持分离。不过我知道,Jinja 有一个 Undefined class,我已经成功地使用它来拦截对另一个项目中未定义变量的访问。

有什么方法可以引发特殊类型的异常(UndefinedException 无效),或者告诉 Jinja 环境在我的扩展中发生错误时记录警告,同时仍然允许它继续执行?

我的想法与这个例子类似:

def _render(*args, **kwrags):
    # ...
    try:
        self.potentially_harmful_operation()
    except Exception as e:
        self.environment.warning(e)
        return Markup("")
    # ...
    return Markup('<img src"{}">'.format(img_path))

所以,澄清一下,正如我在下面的评论中所写:

Fundamentally I guess my question boils down to "how can I make Jinja produce a warning, as it does for e.g. missing variables".

对于任何感兴趣的人,我设法通过实现自己的 Undefined class(主要受 make_logging_undefined 启发并使用 undefined 将其提供给环境来解决这个问题关键字。根据您的需要,默认 make_logging_undefined 可能就足够了。

一旦就绪,诀窍就是在环境中发出警告。这是通过简单地实例化环境的 Undefined 并执行其魔术方法之一(例如 __str__)来完成的。从上面连接到我的示例代码,可以这样完成:

def _render(*args, **kwrags):
    # ...
    try:
        self.potentially_harmful_operation()
    except Exception as e:
        str(self.environment.undefined(e))
        return Markup("")
    # ...
    return Markup('<img src"{}">'.format(img_path))