Perl 错误处理

什么是例外?

程序是在程序执行期间发生的事件,它将暂停或终止程序。

错误处理

错误处理是每个程序员在编程期间必须注意的错误出现时候的处理。Perl 还提供了错误处理技术,我们可以利用这些技术捕获错误并相应地处理错误。

有很多方法可以检查程序中的错误。我们需要检查我们代码中函数的返回码。如果我们能够正确处理这些返回代码,那么可以实现大多数错误处理。

系统调用会返回什么?

在系统调用的情况下,返回状态将存储在两个特殊变量 $? 并且 $!

$! - 这将捕获错误号,或与错误消息关联的错误号。

$? - 这将保存 system() 函数的返回状态。

使用 Perl or 逻辑运算符

我们可以在使用系统调用时使用逻辑 or 运算符进行错误处理。

例如:

open(FH,"<test.txt");

如果文件存在,这将以读取模式打开文件。

如果文件丢失怎么办?

open(FH,"<test.txt") or die("File not exists $!"); # This will perl exit the program if the file not exists. 

open(FH,"<test.txt") or warn ("File not exists $!"); # This will print a warning message on STDERR

Perl Eval

Eval 函数可以处理致命错误、编译错误、运行时错误以及在某个时间点终止代码的错误。

Perl Eval 函数可以有一个代码块或一个表达式。Eval 函数会将所有内容都视为字符串。

比如调用未在脚本中定义的子程序的情况。在这种情况下,脚本终止声明 undefined subroutine,此错误可以在 eval 函数中处理。

eval 有很多用途,一个用途是用在当我们想要在运行时加载特定于操作系统的模块时。

例如:除以零会导致致命错误,为了解决这个问题,我们可以将代码放在 eval 块中。

$a=5; 
$b=0; 

eval 
{ 
 '$result=$a/$b'; 
} 

if($@)
{
 print "$@";    # All the error codes returned by evals will get stored in $@. 
}

输出:

syntax error at C:\Users\XYZ\Text.pl line 8, near ")

执行 C:\Users\XYZ\Text.pl 时由于编译错误而中止。

示例:使用 perl die 语句的 eval

sub test 
{ 
die "Dieing in sub test \n"; 
} 
eval 
{ 
test(); 
}; 

print "Caught : $@\n";

输出:

Caught : Dieing in sub test

使用 Perl Try

Perl 不支持其他编程语言中的 try...catch...finally。我们仍然可以通过加载外部 Perl 模块来使用它们。

use Try::Tiny;

使用此方法,我们可以将你的代码放在 try 块中,并在 warn 中捕获错误。

不像 eval 中用 $@Try::Tiny 中用 $_

try 
{ 
die "Die now"; 
} 

catch 
{ 
warn "caught error: $_"; # not $@ 
};

使用 finally

my $y;

try
{
 die 'foo'
}

finally
{ 
    $y = 'bar' 
};

try 
{ 
    die 'Die now' 
} 

catch 
{ 
    warn "Returned from die: $_" 
} 

finally 
{ 
    $y = 'gone' 
};

输出:

foo at C:\Users\XYZ\Text.pl line 4.

我们可以用这种方式使用 try...catch...finally

try { # statement }

catch {# statement }

finally { # statement };

或者,

try 
{ 
# statement 
} 

finally 
{ 
# statement 
};

或者,

try 
{ 
# statement 
} 

finally 
{ 
# statement 
} 

catch 
{ 
# statement 
};