如何确保我的代码永远不会直接退出?

时间:2011-08-01 13:05:07

标签: perl

eval{
   require $file;
}

/*subsequent code goes here*/
...

如果$file包含exit语句,则后续代码无法运行。

如何处理以便后续代码总是有机会在eval完成时运行?

3 个答案:

答案 0 :(得分:4)

无法中止exit来电。 $file应该使用die,而eval可以使用exit

作为解决方法,您可以全局覆盖BEGIN { *CORE::GLOBAL::exit = sub { die "About to exit" } } 内置:

{{1}}

答案 1 :(得分:1)

没有这样做,但你可以用你自己的函数重新定义perl的退出函数,它会对你的主代码知道的消息进行处理。如果我记得的话,你可以使用CORE :: exit()来获得真正的退出。

最好是在除main之外的包中运行新代码,这样就不会损坏main :: s exit。

2011年 - 2006年8月更新:对于咯咯笑,我试了一下:

my $code = qq[print qq(hello exit 99\n); exit 99;];  

{
  package Foo; 
  local $@;
  use vars qw(*exit);   #required
  local *exit = sub { die "TRAPPED EXIT: @_\n"; };  #override local to package Foo;
  print "doing eval\n"; 
  eval $code; 
  print "reason=$@\n";
}

print "done\n";       #prove we did not truly exit
exit 2;               #set specific exit code

是的,Safe.pm非常适合不受信任的代码,但如果代码是可信的,这就更容易了。

perl exit.pl; echo $?
doing eval
hello exit 99
reason=TRAPPED EXIT: 99
done
2

答案 2 :(得分:1)

查看Safe.pm模块。它允许您限制可以执行的操作符。它适用于需要执行不受信任代码的情况。