2010-11-25 9 views
0

Perl에서 자체 오류를 사용자 정의하는 방법을 알아야합니다. 내가 "성공"나는 종료 코드 0을하지 않는 경우이와 "캐치"오류 및 인쇄 "실패"를 작성하는 노력Perl - 사용자 정의 오류 출력

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

및 인쇄 : 예를 들어, 여기에 몇 가지 코드입니다 . 이 기능을 사용자 정의 할 수있는 방법을 알아야합니다. 나는 실질적으로 die 같은 것을 사용하고 싶지 않습니다. (최종 사용자에게) 다소 이상한 오류를 줄 것입니다.

감사합니다.

+1

/slashes/not \/\ backslashes \\\\ in/path/names를 사용하십시오. – tchrist

+1

'die'가 신비하고 알기 어려운 메시지를 준다면, 당신은 그 머리에 'die'라는 비밀 논증을 전달하고 있기 때문에 당신의 머리에 그대로있을 것입니다. 비난 할 사람은 아무도 없습니다. – tchrist

+1

** ** 끔찍한 ** 오류 메시지입니다. 좋은 오류 메시지 [1]은'STDERR' [2]에 오류를 최소로 만난 프로그램의 이름 인'$ 0'과 함수 이름을 포함합니다. 내부 오류는 대개 스택 추적을 제공합니다. [3]은 적절한 경우 표준 시스템 오류 메시지 인'$!'또는'$?'또는'$ @'를 포함합니다 [4]는 실패한 시스템 호출의 이름을 나타냅니다 [5]. ] 당신이 그 전화에 준 인수를 나열합니다. 귀하의 메시지는 좋은 오류 메시지에 대한 5 가지 규칙의 전부 또는 거의 모두를 무시합니다. – tchrist

답변

4

$? 문서를 읽어야합니다. perlvar. 이 값은 다음과 같습니다

마지막 파이프 가까운 역 따옴표에 의해 반환 된 상태는 ("``") 명령, 성공적으로 호출 (대기) 또는 는 waitpid() 또는 시스템에서() 운영자에게 .

Copy (아마도 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로 이동합니다. 참고로, $! 운영 체제 오류를 표시합니다. 물론 사용자 친화적이지 않은 경우 생략 할 수 있습니다.

+0

감사합니다. djsadinoff의 솔루션이 또한 작동하는 동안, 나는 주 명령어에 내장 된 if 문의 단순함을 좋아해, 나는 대부분 PHP 개발자이기 때문에 익숙하다. – drewrockshard

1

File :: Copy를 사용하고 있습니까? copy()는 perl 키워드 나 내장 함수가 아니기 때문에 무언가를 사용해야합니다.

documentation of File::Copy은 $? 전혀, 그래서 그것은 아마 당신의 실수입니다. 반환 값을 확인하고 0 일 때만 $!를 참조하십시오.

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"; 
} 
+0

네,'File :: Copy'를 사용하고 있습니다. 나는 다른 것들 ('system (@args)'을 사용하여 갈 수도 있지만, 지금은'File :: Copy'가 잘 작동하고있다. – drewrockshard