我注意到Perl社区似乎没有广泛使用Exception.pm和Error.pm。这是由于异常处理中eval的大量占用吗?
此外,总体上看,Perl程序似乎对异常处理有更宽松的政策。这是否有一个强有力的原因呢?
无论如何,在Perl中处理异常的最佳方法是什么?
此外,总体上看,Perl程序似乎对异常处理有更宽松的政策。这是否有一个强有力的原因呢?
无论如何,在Perl中处理异常的最佳方法是什么?
请注意,最后一项意味着你会看到很多这样的代码:
eval { something() };
if ($@) {
warn "Oh no! [$@]\n";
}
eval BLOCK
不是eval STRING
,它不会在运行时编译代码。它只是一种异常处理方法——带有一个有趣的名称和稍微有点奇怪语义的try
方法。 - hobbssetjmp
+longjmp
视为C语言中的异常处理机制(尽管粗糙),那么shell也有一个:trap
+kill
(尽管看起来更加粗糙)。 - Ruslan请不要直接测试 $@ 变量,因为它是一个全局变量,即使测试本身也可能会改变它。
通用的 eval-template:
my $result;
eval {
$result= something();
# ...
1; # ok
} or do {
my $eval_error= $@ || "error";
# ...
die $eval_error;
}; # needs a semicolon
try
{
# something
}
catch( Exception $e )
{
# catch this in $e
}