2010-11-25 7 views
0

Мне нужно знать, как настроить собственные ошибки на Perl. Например, вот некоторый код: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, и печать «Успех», когда я делаю , Мне нужно знать, как я могу настроить это; Я действительно не хочу использовать die или что-то в этом роде, где он даст несколько загадочную ошибку (конечному пользователю).

Спасибо!

+1

Использование/косая черта/нет \\\\ обратная коса \\\\ в/путь/имена. – tchrist 2010-11-26 00:15:53

+1

Если `die` дает таинственные и непонятные сообщения, на вашей голове, так как вы - тот, кто передает критический аргумент` die`. У вас больше никто не виноват. – tchrist 2010-11-26 00:17:56

+1

Это ** ужасные сообщения об ошибках. Хорошее сообщение об ошибке [1] относится к `STDERR` [2], включая` $ 0`, имя программы, которая встретила ошибку как минимум, и, возможно, имя функции; внутренние ошибки обычно также дают трассировку стека [3], включая `$!`, стандартное системное сообщение об ошибке, где оно подходит, или, возможно, `$?` или `$ @` иначе [4] указывает имя неудачного syscall [5 ] перечисляет аргументы, которые вы дали этому вызову. В вашем сообщении игнорируются все или почти все эти пять правил для сообщений об ошибках. – tchrist 2010-11-26 00:21:49

ответ

4

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

статус, возвращаемый последней трубы близко, кавычкой ("`") команда, успешного вызова ждать() или waitpid(), или из системы() оператор ,

Ваш звонок для копирования (предположительно из файла :: Копия) находится не далеко от любой из этих категорий, поэтому $? не задано.

Однако, если вы прочтете документацию для 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

Вы используете 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"; 
}