📅  最后修改于: 2021-01-07 08:38:05             🧑  作者: Mango
在执行程序时,错误也会与程序一起运行。如果无法正确处理这些错误,则程序可能无法顺利运行。
错误处理使我们能够通过采取适当的措施来处理这些错误并平稳地运行程序。可以通过错误处理来处理各种类型的错误。
您需要捕获错误并通过纠正错误来平稳地运行程序。 Perl提供了许多方法,如下所示。
die()函数会为您提供正确的错误消息。遇到错误,它将立即终止脚本。如果您不在脚本中使用die()函数,则脚本将继续运行。
use strict;
use warnings;
open(my $fh, '>', 'sssit/javatpoint/file1.txt');
print $fh "Example to show Error Handling\n";
close $fh;
print "done\n";
输出:
Print() on closed filehandle $fh at script.pl
done
查看上面的输出,脚本在遇到错误打印“ done”时继续运行。
open()函数只会照常打开文件。 die()函数将引发异常并仅退出脚本。
在'open or die'函数,左侧具有open()函数。在右侧,我们具有die()函数。
如果open()函数返回true,则脚本继续执行下一行,并且die()函数不执行。
如果open()函数返回false,则脚本进入die()函数,该函数引发异常并退出脚本。
在这里,在此示例中,我们给出了错误的文件路径,这是由于die()函数将执行并退出脚本。
use strict;
use warnings;
open(my $fh, '>', 'sssit/javatpoint/file1.txt') or die;
print $fh "Example to show Error Handling\n";
close $fh;
print "done\n";
输出:
Died at script.pl
在输出中,当我们使用die()函数脚本时,遇到错误将退出。因此,不会打印“完成”。
如果要添加有关错误的一些说明,可以将其添加到die()函数。如果您的脚本死了,此说明将作为错误消息print。
use strict;
use warnings;
open(my $fh, '>', 'sssit/javatpoint/report.txt')
or die "Could not open file due to 'sssit/javatpoint/report.txt'";
close $fh;
print "done\n";
输出:
Could not open file due to 'sssit/javatpoint/report.txt'at script.pl
Look at the above output, we got an explanation about the error in our script.
$!变量是Perl语言中的内置变量。通过在die()函数添加解释,我们知道了错误消息,但是我们仍然不知道其背后的原因。要知道错误的确切原因,请使用$!变量。它将print由操作系统告知有关文件的消息。
use strict;
use warnings;
my $filename = 'sssit/javatpoint/file1.txt';
open(my $fh, '>', $filename) or die "Could not open file '$filename' $!";
close $fh;
print "done\n";
输出:
Could not open file 'sssit/javatpoint/file1.txt' No such file or directory
警告函数会发出警告消息,但不会退出脚本。该脚本将继续运行。因此,当您只想print警告消息并继续执行程序的其余部分时,此功能很有用。
use strict;
use warnings;
my $filename = 'sssit/javatpoint/file1.txt';
open(my $fh, '>', $filename) or warn "Can't open file";
print "done\n";
输出:
Can't open file at hw.pl at line 4.
done
查看上面的输出,我们已经打印了“ done”,以表明即使在打印警告消息之后,执行仍然继续。
错误处理的现代方法是使用Carp标准库。 confess()函数在Carp库中使用。我们已通过$!作为其论点。
use strict;
use warnings;
use Carp;
my $filename = 'sssit/javatpoint/file1.txt';
open(my $fh, '>', $filename) or confess($!);
print "done\n";
输出:
No such file or directory.
done
eval()函数是Perl中的内置函数,用于检测正常的致命错误。 eval()函数提供了一个代码块,而不是传递给字符串。
如果存在语法错误,则eval块将失败。但是,如果发生运行时错误,脚本将继续运行。
在下面的程序中,没有语法错误。
输出:
Script is still running!
Illegal division by zero
查看上面的输出,脚本继续运行,因为它们没有语法错误。
当脚本简短包含十行时,使用die()函数。 die()函数也可以不带$!使用。
confess()函数用于carp包中。对于较大的脚本,最好使用confess 函数。