Perl 错误处理
Perl中的错误处理是指对由于代码或编译器中的某些错误而导致执行困难的程序采取适当的措施。进程很容易出错。例如,如果打开一个不存在的文件就会产生错误,或者访问一个没有被声明的变量就会产生错误。
如果发生错误,程序就会停止,因此使用错误处理,我们可以采取适当的措施,而不是完全停止程序。错误处理是任何容易出错的语言的一个主要要求。
错误可以按其发生的时间进行分类。
- 编译时错误
- 运行时错误
编译时错误: 它是一种错误,如语法错误或缺少文件引用,使程序不能成功编译。
运行时错误: 是指在程序运行时发生的错误,这些错误通常是逻辑错误,产生不正确的输出。
Perl中的错误处理
Perl提供了两个内置函数来产生致命的异常和警告,它们是。
- die()
- warn()
die() : 在发生致命错误时发出信号,即不允许有关的程序继续运行。
例如,用 open() 访问一个文件时,在进行其他文件操作之前,会告知打开操作是否成功。
open FILE, "filename.txt" or die "Cannot open file: $!\n";
注意: $! 是一个预定义的变量,返回系统在出错时返回的错误信息。
warn() : 与 die() 函数不同, warn() 产生一个警告而不是一个致命的异常。
比如说
open FILE, "filename.txt" or warn "Cannot open file: $!\n";
其他可用于处理错误的方法
- if 语句
- unless函数
- 错误”:try “模块
if语句: 一个代码块中的语句只有在条件为真时才会被执行。
if(-e filename)){
print "File exists";
} else {
die "Cannot open the file.!"
}
unless函数: 代码块中的语句只有在表达式返回错误时才会被执行。
unless(-e filename) {
die "File Does not Exist!!";
}
错误’:try’: 它类似于Java编程语言中的try和catch块。
use Error ':try';
try{
open FILE, "filename.txt" or die "File cannot be opened: !";
while () {
# Do something
}
close FILE;
} catch Error::Simple with {
myerr = shift;
print "ERROR: $err";
};
模块内的错误
到目前为止,我们已经看到了Perl是如何处理和通知程序员错误的,但是如果一个模块中出现了错误,需要通知程序员怎么办?这种错误会给所有导入该模块的代码的执行带来困难。
例如,你做了一个模块,比方说 test.pm ,我们做了一个错误的计算,所以错误信息将被抛出,如下所示。
package test;
sub functionName
{
warn "Error in module!"
}
1;
use test;
functionName();
输出
Error in module! at test.pm line 6
这种错误处理技术可以被程序员用来纠正模块中的所有错误。 Carp模块() 可以用来提供报告模块内错误的方法。
carp模块
它是模块的警告和死亡的替代方法。它对用户定义的模块很有用,因为它们的作用有点像 die() 和 warning() ,但有一个由程序员添加的信息。
这个Carp模块提供了一些函数,它们是:
- carp()
- cluck()
- croak()
- 忏悔()
carp()函数: 这个函数的工作原理类似于warning函数,在不退出脚本的情况下打印出用户给出的信息。
例子
package test;
use Carp;
sub functionName
{
carp "Error in module!"
}
1;
use test;
functionName();
输出
Error in module! at test.pm line 8
cluck()函数: 这个函数产生一个上下文,是调用栈中每个调用的摘要。它遵循与 carp() 函数相同的过程,但它打印的是导致调用特定函数的所有模块的堆栈。
例子
package Test;
use Carp qw(cluck);
sub function_name {
cluck "Error in module!";
}
1;
use Test;
function_name();
输出
Error in module! at Test.pm line 5
Test::function_name() called at test.pl line 2
croak()函数: 该函数与 die() 函数类似,只是它产生的信息更短,报告的错误来自你的模块被调用的地方。
例子
package Test;
use carp;
sub functionName {
croak "Error in module!";
}
1;
use Test;
functionName();
输出
Error in module! at test.pl line 2
confess()函数: 该函数与 cluck() 函数类似。它调用die函数,然后打印出导致调用特定函数的所有模块的堆栈。
示例 。
package Test;
use Carp;
sub functionName {
confess "Error in module!";
}
1;
use Test;
functionName();
输出
Error in module! at Test.pm line 5
Test::functionName() called at test.pl line 2