如何在Jinja2模板中获取引起异常(除TemplateSyntaxError之外)的行号?

时间:2014-11-17 07:16:56

标签: python jinja2

当模板包含语法错误时,Jinja会抛出TemplateSyntaxError,其中lineno属性包含发生错误的模板行号。

如果发生错误而非语法错误,如何获取行号?例如,以下标记:

{{ len(SettlementDate)+1 }}
如果SettlementDate不像列表那样,

会导致Jinja抛出TypeError。然后,我如何找出发生此错误的位置,以便向用户报告?对于我的用例,提前清理上下文变量不是一种选择。

2 个答案:

答案 0 :(得分:0)

我只是遇到了这个问题。不幸的是,这似乎是一个普遍的问题,没有解决方案。为了使研究更容易出现在接下来的角色中,以下是一些相关的参考文献:

https://github.com/saltstack/salt/issues/21298 https://github.com/saltstack/salt/issues/28345

是的,这些参考文献与saltstack特别相关,但是jinja中存在潜在的问题。

我在特定的用例中建立了一种解决方法:

  try:
    output = env.get_template(
        "envoy.{}.yaml".format(args.type.lower())
    ).render(**context)
    print("Template is hydrated")
  except Exception as e:
    print(
        """
            Error Generating Template!
            --------------------------
            Error:    {}
            Template: {}

            An error occurred hydrating the template with the context
            parameters.  The error exists in either the context or the
            template but has nothing to do with the YAML formatting of
            the template at this time.

        """.format(e,args.template)
    )
    if args.debug:
        print(output)
    else:
        print("\nTry running with --debug for more info.")
    sys.exit(1)

免责声明:在我的实际解决方案中使用--debug会产生难看的堆栈跟踪信息,从而增加用户的学习曲线。您必须阅读该堆栈跟踪以查找特定于模板的行,例如这个:

文件“ /Users/scaldwell/git//src/serviceProxy/.yaml”,模板中的第4行     {%来自“ includes / listener.payload.noop.yaml”的上下文上下文中导入payload_listener_noop}

这应该是更清洁的输出。...也许我有一天会修复这个周末项目或Atlassian ShipIt项目。在此之前,这就是JINJA所提供的。

答案 1 :(得分:-2)

我认为在jinja中,内置函数是length()而不是len()

http://jinja.pocoo.org/docs/dev/templates/#length