Perl - 错误处理

首页 / Perl入门教程 / Perl - 错误处理

如果发生错误,程序将停止。因此可以使用适当的错误处理来处理各种类型的错误,这些错误可能在程序执行期间发生,可以采取适当的方法处理错误。

您可以通过多种不同方式来识别和捕获错误。在Perl中捕获错误,然后正确处理它们非常容易。这里有几种可以使用的方法。

if 语句

当需要检查语句的返回值时, if语句是显而易见的选择。如-

if(open(DATA, $file)) {
   ...
} else {
   die "Error: Couldn't open the file - $!";
}

这里变量$!返回实际的错误消息。另外,在合理的情况下,我们可以将语句减少为一行;如-

open(DATA, $file) || die "Error: Couldn't open the file $!";

unless 函数

unless函数与if逻辑相反,语句可以完全绕过成功状态,并且仅在表达式返回false时才执行。如-

unless(chdir("/etc")) {
   die "Error: Can't change directory - $!";
}

unless语句仅当表达式失败时才要引发错误或替代方法时,才是最佳选择。该语句在单行语句中使用时也很有意义-

die "Error: Can't change directory!: $!" unless(chdir("/etc"));

三元运算符

对于非常简短的测试,可以使用条件运算符?:

print(exists($hash{value}) ? 'There' : 'Missing',"\n");

此处我们要实现的目标还不是很清楚,但效果与使用 ifunless 语句相同。

warn 函数

警告函数仅会发出警告,一条消息会打印到STDERR,但不会采取进一步措施。因此,如果您只想为用户打印警告并继续进行其余操作,它会更有用-

chdir('/etc') or warn "Can't change directory";

die 函数

die函数的作用与warn相同,只是它还会调用exit。在普通脚本中,此函数具有立即终止执行的作用。如果程序中有错误,则应使用此函数以防继续进行-

chdir('/etc') or die "Can't change directory";

模块错误

我们应该能够处理两种不同的情况-

  • 报告模块中的错误,该错误引用模块的文件名和行号 - 这在调试模块时,或者在您特别想引发与模块相关而不是与脚本相关的错误时很有用。

  • 报告引用调用者信息的模块中的错误,以便您可以调试脚本中导致错误的行。

warndie 函数的工作原理与您在模块中调用时的预期稍有不同。如

package T;

require Exporter;
@ISA=qw/Exporter/;
@EXPORT=qw/function/;
use Carp;

sub function {
   warn "Error in module!";
}
1;

当从下面的脚本中调用时-

无涯教程网

链接:https://www.learnfk.comhttps://www.learnfk.com/perl/perl-error-handling.html

来源:LearnFk无涯教程网

use T;
function();

它将产生以下输出-

Error in module! at T.pm line 9.

这或多或少是您可能期望的,但不一定是您想要的。从模块程序员的角度来看,该信息很有用,因为它有助于指出模块本身中的错误。对于最终用户而言,所提供的信息是毫无用处的。

Carp 函数

carp函数与warn基本等效,并且将消息打印到STDERR,而无需实际退出脚本并打印脚本名称。

package T;

require Exporter;
@ISA=qw/Exporter/;
@EXPORT=qw/function/;
use Carp;

sub function {
   carp "Error in module!";
}
1;

当从下面的脚本中调用时-

无涯教程网

链接:https://www.learnfk.comhttps://www.learnfk.com/perl/perl-error-handling.html

来源:LearnFk无涯教程网

use T;
function();

它将产生以下输出-

Error in module! at test.pl line 4

Cluck 函数

cluck函数遵循相同的基本原理,但还会打印导致该函数被调用的所有模块的堆栈跟踪,包括原始脚本中的信息。

package T;

require Exporter;
@ISA=qw/Exporter/;
@EXPORT=qw/function/;
use Carp qw(cluck);

sub function {
   cluck "Error in module!";
}
1;

当从下面的脚本中调用时-

无涯教程网

链接:https://www.learnfk.comhttps://www.learnfk.com/perl/perl-error-handling.html

来源:LearnFk无涯教程网

use T;
function();

它将产生以下输出-

Error in module! at T.pm line 9
   T::function() called at test.pl line 4

Croak 函数

croak 函数等同于 die ,不同之处在于它会向上一级报告呼叫者。像die一样,此函数也会在向STDERR报告错误后退出脚本-

package T;

require Exporter;
@ISA=qw/Exporter/;
@EXPORT=qw/function/;
use Carp;

sub function {
   croak "Error in module!";
}
1;

当从下面的脚本中调用时-

无涯教程网

链接:https://www.learnfk.comhttps://www.learnfk.com/perl/perl-error-handling.html

来源:LearnFk无涯教程网

use T;
function();

它将产生以下输出-

Error in module! at test.pl line 4

Confess 函数

Confess函数类似于 cluck ;它调用die,然后一直打印堆栈跟踪直到原始脚本。

package T;

require Exporter;
@ISA=qw/Exporter/;
@EXPORT=qw/function/;
use Carp;

sub function {
   confess "Error in module!";
}
1;

当从下面的脚本中调用时-

无涯教程网

链接:https://www.learnfk.comhttps://www.learnfk.com/perl/perl-error-handling.html

来源:LearnFk无涯教程网

use T;
function();

它将产生以下输出-

Error in module! at T.pm line 9
   T::function() called at test.pl line 4

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

深入浅出gRPC -〔李林锋〕

OAuth 2.0实战课 -〔王新栋〕

Web安全攻防实战 -〔王昊天〕

陶辉的网络协议集训班02期 -〔陶辉〕

如何落地业务建模 -〔徐昊〕

程序员的个人财富课 -〔王喆〕

Tony Bai · Go语言第一课 -〔Tony Bai〕

Spring Cloud 微服务项目实战 -〔姚秋辰(姚半仙)〕

AI大模型系统实战 -〔Tyler〕

好记忆不如烂笔头。留下您的足迹吧 :)