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
};