Вы ищете:
DEBUG_UNDEF
Эта опция заставляет Template Toolkit выдавать ошибку 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.)
Если вы хотите выполнить специальную обработку исключения, вам потребуется , чтобы перехватить его или заменить обработчик сигнала __DIE__
.
Давайте соединим это:
#!/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.
Мой подход состоял в том, чтобы использовать два разных экземпляра класса Template:
$debug_tt
с включенным флагом DEBUG_UNDEF
, который скрывает свой вывод в переменной $output
.
$tt
, который является экземпляром vanilla и выводит его вывод в STDOUT
, как по умолчанию.
Оба экземпляра используют один и тот же шаблон, хранящийся в $template
, и тот же хэш переменной, который хранится в $vars
. $debug_tt
заключен в eval
, чтобы избежать преждевременного выхода, и выдается предупреждение, если $debug_tt->error()
имеет значение true. $tt
выполняется нормально. Я думаю, что это удовлетворяет вашим основным требованиям, хотя, вероятно, неэффективно. Нам нужно проанализировать $template
дважды, используя этот метод.
Некоторые мысли, которые у меня были над этим:
Было бы неплохо, если бы Template::Toolkit
использовал Carp
, чтобы мы могли получить немного больше контекста в предупреждении.
Вероятно, можно получить класс из Template, который будет warn
вместо die
при ошибке. Я не хотел этого делать.
В зависимости от того, как настроены ваши шаблоны, может иметь смысл подавать их по одной строке за раз, чтобы вы могли выдавать номера строк при обнаружении неопределенного значения.
Должна быть возможность изменять шаблоны для проверки их собственных ошибок и создавать более осмысленный текст перед лицом неопределенных значений.