2009-02-21 30 views

回答

16

您正在尋找:

DEBUG_UNDEF 

此選項將導致模板工具包每當遇到一個未定義的變量值拋出一個「民主基金」的錯誤。

use Template::Constants qw(:debug); 

my $template = Template->new({ 
    DEBUG => DEBUG_UNDEF, 
}); 

(從http://search.cpan.org/dist/Template-Toolkit/lib/Template/Manual/Config.pod

如果你想要做的異常的一些特殊的處理,你需要to catch it or replace the __DIE__ signal handler


讓我們把它一起:

#!/usr/bin/perl 

use strict; 
use warnings; 

use Template; 
use Template::Constants qw(:debug); 

my $debug_tt = Template->new({ 
    DEBUG => DEBUG_UNDEF, 
}); 

my $tt = Template->new(); 

my $vars = { 
    something => "42", 
}; 

my $template = <<EOF; 
First something undefined: [% nothing %]. 
And now something defined: [% something %]. 
EOF 

my $output = ''; 

eval {$debug_tt->process(\$template, $vars, \$output)}; 
warn $debug_tt->error() if $debug_tt->error(); 

$tt->process(\$template, $vars); 

輸出是:

undef error - nothing is undefined 
First something undefined: . 
And now something defined: 42. 

我的方法是使用模板類的兩個不同的實例:

  1. $debug_tt哪有DEBUG_UNDEF標誌打開並將其輸出隱藏在$output變量中。

  2. $tt這是一個香草實例並將其輸出打印到STDOUT,因爲它是默認值。

兩個實例使用存儲在$template相同的模板,並存儲在$vars相同的變量的散列。 $debug_tt包裝在eval中以避免過早退出,並且如果$debug_tt->error()爲真,則發出警告。 $tt正常執行。我認爲這符合您的主要要求,但可能效率不高。我們需要使用這種方法解析$template兩次。

的幾點思考我對這個工作:

  1. 這本來是很好,如果Template::Toolkit曾使用Carp這樣我們就可以得到警告更多的上下文。

  2. 人們可能會從模板中派生出一個類,它會在出現錯誤時將warn而不是die。我不想那樣做。

  3. 根據您的模板設置方式,一次只能在一行中輸入它是有意義的,這樣您可以在找到未定義的值時發出行號。

  4. 應該可以更改模板來測試自己的錯誤,並在面對未定義的值時發出更明智的文本。

相關問題