die()不会退出Perl脚本的情况?

时间:2011-07-13 22:19:24

标签: perl

我正在使用长时间运行的Perl脚本调试一个非常奇怪的问题。

问题是脚本没有按预期在die()上退出。相反,脚本会挂起而不返回。

我自己没有定义任何错误处理程序,所以我认为die()会导致脚本立即终止。

这是脚本的基本结构和使用的模块:

#!/usr/bin/perl

use strict;
use utf8;
use warnings;

use DBI; # with MySQL driver ("dbi:mysql:database=...")
use Geo::IP;
use POSIX;
use URI::Escape;

open(COMMAND, 'command_line |');
while (<COMMAND>) {
    #
    # .. stuff that can go wrong ..
    #
    die("I'm expecting the script to terminate here. It doesn't.") if ($gone_wrong);
}
close(COMMAND);

这种行为的解释是什么?是否已知使用的任何模块都可以设置错误处理程序,以解释挂在die()上的脚本?

1 个答案:

答案 0 :(得分:4)

好吧,在END之后仍然会调用die块和对象析构函数。如果其中一个挂起(或做了需要很长时间的事情),脚本将不会立即退出。但是在<{1}}打印消息之后会发生(除非STDERR被缓冲,因此您不会立即看到消息)。

你提到DBI,所以你可能有一个数据库句柄,它的析构函数被调用。 (不过我不确定是不是问题。)