【问题标题】:How can I throw a warning in Template::Toolkits CATCH block?如何在 Template::Toolkits CATCH 块中抛出警告?
【发布时间】:2011-11-16 05:24:30
【问题描述】:

我正在处理的代码在Template::Toolkit 模板中有一堆TRY/CATCH 块。它们看起来像这样:

[% TRY; x = OBJ.method(data); CATCH; "<!-- error: $error -->"; END %]

从两个角度来看,这很糟糕。首先,错误被插入到交给用户的 HTML 中,其次,开发人员很难找到错误。在我看来,所有错误都应该记录到同一个错误日志中。现在我通过warn 函数做到这一点。我已将上面的代码更改为

[% TRY %]
    [% x = OBJ.foo(data) %]
[% CATCH %]
    [% RAWPERL %]
        warn "error calling method foo on a bar object: " . $stash->get("error");
    [% END %]
[% END %]

但是对于本应简单的事情来说,这感觉太冗长了。有没有我不知道的更好的方法来做到这一点?

【问题讨论】:

  • 你必须在模板中这样做吗?我认为这种(相对)复杂的结构属于准备要显示的数据的代码(即控制器,如果我们使用 MVC 术语),而不是模板本身。
  • @Michal 原则上我完全同意你的观点,但假设代码位于 MVC 框架中。可悲的是,这是令人讨厌的遗留代码。没有控制器类。
  • 我仍然会尝试在业务逻辑和表示之间引入尽可能多的分离,例如在模板开头的单个 [% RAWPERL %] 块中完成大部分工作,然后再获取任何内容渲染。

标签: perl template-toolkit


【解决方案1】:

好主意!我自己从来没想过,但现在将为我自己的系统实施解决方案。

开箱即用! stderr 过滤器将块的输出打印到 STDERR:

[% FILTER stderr %]  
   Found a big problem
[% END %]

无需 MVC,无需代码,生活更美好。

一种更高级的方法是在控制器中创建一个对象,该对象的工作是记录错误,以便更智能地处理它们:

[% logger.warn('大问题') %]

它可以通过电子邮件发送给他们,将它们放入日志中,或者向您不喜欢的开发者发送短信。 ;-)

【讨论】:

    猜你喜欢
    • 2021-09-21
    • 2019-04-30
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多