📜  Perl 中的错误处理

📅  最后修改于: 2022-05-13 01:54:57.178000             🧑  作者: Mango

Perl 中的错误处理

Perl 中的错误处理是对由于代码或编译器中的某些错误而导致执行困难的程序采取适当措施的过程。流程容易出错。例如,如果打开不存在的文件会引发错误,或者访问尚未声明的变量会引发错误。
如果发生错误,程序将停止,因此使用错误处理我们可以采取适当的措施,而不是完全停止程序。错误处理是任何容易出错的语言的主要要求。

错误可以按发生的时间分类:

  1. 编译时错误
  2. 运行时错误

编译时错误:是语法错误或缺少文件引用等错误导致程序无法成功编译。

运行时错误:这是程序运行时发生的错误,这些错误通常是产生不正确输出的逻辑错误。

Perl 中的错误处理

Perl 提供了两个内置函数来生成致命异常和警告,它们是:

  1. 死()
  2. 警告()

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 语句
  • 除非函数
  • 错误“:尝试”模块

if 语句:代码块中的语句只有在条件成立时才会执行。

perl
if(-e $filename)){
  print "File exists";
  
} else {
  die "Cannot open the file. $!"
}


perl
unless(-e $filename) {
   die "File Does not Exist! $!";
}


perl
use Error ':try';
  
try{
  open FILE, "filename.txt" or die "File cannot be opened: $!";
  while () {
      # Do something
   }
   close FILE;
} catch Error::Simple with {
     my $err = shift;
     print "ERROR: $err";
};


perl
package test;
sub functionName
{
   warn "Error in module!"
}
1;


perl
package test;
use Carp;
  
sub functionName
{
   carp "Error in module!"
}
1;


perl
package Test;
use Carp qw(cluck);
  
sub function_name {
    cluck "Error in module!";
}
1;


perl
package Test;
use carp;
  
sub functionName {
    croak "Error in module!";
}
1;


perl
package Test;
use Carp;
  
sub functionName {
    confess "Error in module!";
}
1;


除非函数:代码块中的语句只有在表达式返回 false 时才会执行。

perl

unless(-e $filename) {
   die "File Does not Exist! $!";
}

Error ':try' :它类似于Java编程语言中的 try 和 catch 块。

perl

use Error ':try';
  
try{
  open FILE, "filename.txt" or die "File cannot be opened: $!";
  while () {
      # Do something
   }
   close FILE;
} catch Error::Simple with {
     my $err = shift;
     print "ERROR: $err";
};

模块内的错误

到目前为止,我们已经看到 Perl 如何处理错误并将错误通知给程序员,但是如果模块中有错误需要通知程序员怎么办?此类错误将导致导入该特定模块的所有代码难以执行。

例如,您创建了一个模块,比如说test.pm ,我们正在做一个错误的计算,所以会抛出一个错误消息,如下所示:

perl

package test;
sub functionName
{
   warn "Error in module!"
}
1;
use test;
functionName();

输出:

Error in module! at test.pm line 6

程序员可以使用这种错误处理技术来纠正模块中的所有错误。 Carp module()可用于提供报告模块内错误的方法。

鲤鱼模块

它是警告和死亡模块的替代方法。它对于用户定义的模块很有用,因为它们的行为有点像die()warn() ,但带有由程序员添加的消息。
这个 Carp 模块提供了一些功能,它们是:

  1. 鲤鱼()
  2. 咕()
  3. 发牢骚()
  4. 承认()

carp()函数:此函数的工作原理类似于警告函数,并在不退出脚本的情况下打印用户给出的消息。
例子:

perl

package test;
use Carp;
  
sub functionName
{
   carp "Error in module!"
}
1;
use test;
functionName();

输出:

Error in module!  at test.pm line 8

cluck()函数:此函数产生一个上下文,它是调用堆栈中每个调用的摘要。它遵循与carp()函数相同的过程,但它打印导致调用特定函数的所有模块的堆栈。
例子:

perl

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()函数,不同之处在于它会生成一条较短的消息,报告错误来自调用模块的位置。
例子:

perl

package Test;
use carp;
  
sub functionName {
    croak "Error in module!";
}
1;
use Test;
functionName();

输出:

Error in module! at test.pl line 2

坦白()函数:这个函数类似于cluck()函数。它调用 die函数,然后打印导致调用特定函数的所有模块的堆栈。
例子:

perl

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