Perl - пользовательский вывод ошибок - PullRequest
0 голосов
/ 25 ноября 2010

Мне нужно знать, как настроить свои собственные ошибки в Perl. Например, вот некоторый код:

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

Я попытался написать это, «поймать» ошибку и вывести «Failure», когда я не получаю код выхода 0, и вывести «Success», когда получаю. Мне нужно знать, как я могу настроить это; Я действительно не хочу использовать die или что-то подобное, где это даст несколько загадочную ошибку (конечному пользователю).

Спасибо!

Ответы [ 2 ]

4 голосов
/ 25 ноября 2010

Вам нужно прочитать документацию на $?в перлвар .Это значение:

Состояние, возвращаемое последней командой закрытия канала, командой backtick ("` `"), успешным вызовом wait () или waitpid () или оператором system ().

Ваш призыв к копированию (предположительно из 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 голос
/ 25 ноября 2010

Используете ли вы File :: Copy? Вы должны что-то использовать, потому что copy () не является ключевым словом perl или встроенной функцией.

Документация 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";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...