在以下简短程序中:
use Template;
my $template = Template->new (INCLUDE_PATH => ".");
$template->process ("non-existent-file")
or die $template->error ();
为什么die不生成行号和换行符?我的输出如下:
~ 502 $ perl template.pl
file error - non-existent-file: not found ~ 503 $
答案 0 :(得分:10)
Template
返回类型为Template::Exception
的错误对象。该对象具有重载的字符串化,该值在打印时应用,但是当die
查看该值时,它会看到一个引用,并且不会附加行号和换行符。之前将值强制转换为字符串以解决问题:
use Template;
my $template = Template->new (INCLUDE_PATH => ".");
$template->process ("non-existent-file")
or die '' . $template->error ();
打印
file error - non-existent-file: not found at scratchpad.pl line 25.
答案 1 :(得分:0)
虽然@ Eric的答案确实解决了OP问题,但我建议添加一个空格而不是预先挂起一个空字符串。
原因是如果模板中存在问题,则会将错误报告为来自模板文本而不是perl文件中的行号(这就是我想要的)。见这个简短的例子:
use Template;
my $template = Template->new();
# Clearly a division by zero bug
$template->process(\"[% 1 / 0 %]")
or die $template->error();
这导致:
undef error - Illegal division by zero at input text line 1.
这不是很有帮助。我想要perl文件位置。相反,我建议:
my $template = Template->new();
$template->process(\"[% 1 / 0 %]")
or die $template->error() . ' ';
产生:
undef error - Illegal division by zero at input text line 1.
at test.pl line 11.
这样我也得到了perl文件中的行号。不过,它确实看起来有点难看。 (如果你愿意的话,你现在可以停止阅读了。)
更正确的方法是:
use Template;
my $template = Template->new();
$template->process(\"[% 1 / 0 %]")
or do {
my $error = $template->error . '';
chomp $error;
die $error;
};
产生这个输出:
undef error - Illegal division by zero at input text line 1. at t2.pl line 15.
但它只是如此冗长,并且在那里有一个奇怪的.
。我实际上最终创造了:
sub templateError {
my ($template) = @_;
my $string = $template->error->as_string;
chomp $string;
$string =~ s/(line \d+)\.$/$1/;
return $string;
}
...
use Template;
my $template = Template->new ();
$template->process (\"[% 1 / 0 %]")
or die templateError($template);
所以我得到了这个:
undef error - Illegal division by zero at input text line 1 at test.pl line 30.
以及OPs示例:
file error - non-existent-file: not found at test.pl line 31.