Perl - 自定义错误输出

时间:2010-11-25 15:22:26

标签: perl error-handling

我需要知道如何在Perl中自定义我自己的错误。例如,这里有一些代码:

my $filename = 'filaname1.exe';
print "Copying $filename";
copy("$dir_root\\$filename", "$spcl_dir\\$filename");
if ($? == "0") {
    print " - Success!\n";
}
else { print " - Failure!\n"; }

我尝试写这个并“捕获”错误并在我没有得到退出代码0时打印“失败”,并在我这样做时打印“成功”。我需要知道如何定制这个;我真的不想使用die或类似的东西,它会给一些有点神秘的错误(给最终用户)。

谢谢!

2 个答案:

答案 0 :(得分:4)

您需要阅读有关$的文档吗?在perlvar。该值为:

  

最后一个管道返回的状态   close,backtick(“``”)命令,   成功调用wait()或   waitpid(),或从系统()   操作

你的复制电话(大概来自File :: Copy)并不是这些类别中的任何一个,所以$?没有设定。

但是,如果您阅读File::Copy的文档,您将看到其功能全部“成功时返回1,失败时返回0”。所以你可以大大简化你的代码。

#!/usr/bin/perl

use strict; use warnings;

use File::Copy;

if (copy('notthere', 'somewhere else')) {
  warn "success\n";
} else {
  warn "failure: $!\n";
}

请注意,我使用了“警告”而不是“打印”,以便将错误发送到STDERR。另请注意,使用$!显示操作系统错误。当然,如果它不够用户友好,就可以省略。

答案 1 :(得分:1)

您使用的是File :: Copy吗?你必须使用某些东西,因为copy()不是perl关键字或内置函数。

documentation of File::Copy不是指$?所以,这可能是你的错。您想检查返回值,并且只有在它为零时,请参阅$!。

use strict;
use File::Copy qw(copy);
my ($from, $to) = @ARGV;
my $res = copy ($from, $to);
if( $res ){
  print "Okay\n";
}
else{
  print "Not Okay: $!\n";
}