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))
我正在开发一个 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))