Perl-오류 처리
실행과 오류는 항상 함께 진행됩니다. 존재하지 않는 파일을 여는 경우. 이 상황을 제대로 처리하지 않으면 프로그램의 품질이 좋지 않은 것으로 간주됩니다.
오류가 발생하면 프로그램이 중지됩니다. 따라서 적절한 오류 처리는 프로그램 실행 중에 발생할 수있는 다양한 유형의 오류를 처리하는 데 사용되며 프로그램을 완전히 중지하는 대신 적절한 조치를 취합니다.
다양한 방법으로 오류를 식별하고 트랩 할 수 있습니다. Perl에서 오류를 포착하고 적절하게 처리하는 것은 매우 쉽습니다. 다음은 사용할 수있는 몇 가지 방법입니다.
if 문
그만큼 if statement명령문에서 반환 값을 확인해야 할 때 확실한 선택입니다. 예를 들면-
if(open(DATA, $file)) {
...
} else {
die "Error: Couldn't open the file - $!";
}
여기 변수 $! 실제 오류 메시지를 반환합니다. 또는 그렇게하는 것이 타당한 상황에서 문장을 한 줄로 줄일 수 있습니다. 예를 들면-
open(DATA, $file) || die "Error: Couldn't open the file $!";
비정상적인 기능
그만큼 unlessfunction은 if : 문이 성공 상태를 완전히 우회 할 수 있으며 표현식이 false를 반환하는 경우에만 실행됩니다. 예를 들면-
unless(chdir("/etc")) {
die "Error: Can't change directory - $!";
}
그만큼 unless문은 오류를 발생 시키거나 표현식이 실패하는 경우에만 대안을 발생시킬 때 가장 잘 사용됩니다. 이 문장은 한 줄 문장에서 사용될 때도 의미가 있습니다.
die "Error: Can't change directory!: $!" unless(chdir("/etc"));
여기서 우리는 chdir 작업이 실패 할 때만 죽고 잘 읽습니다.
삼항 연산자
매우 짧은 테스트의 경우 조건부 연산자를 사용할 수 있습니다. ?:
print(exists($hash{value}) ? 'There' : 'Missing',"\n");
여기서 우리가 달성하고자하는 것이 무엇인지는 명확하지 않지만 그 효과는 if 또는 unless성명서. 조건부 연산자는 식 또는 문 내에서 두 값 중 하나를 빠르게 반환하려는 경우에 가장 적합합니다.
경고 기능
경고 기능은 경고를 발생시키고 메시지가 STDERR에 인쇄되지만 추가 조치는 수행되지 않습니다. 따라서 사용자에게 경고를 인쇄하고 나머지 작업을 계속하려는 경우 더 유용합니다.
chdir('/etc') or warn "Can't change directory";
다이 기능
die 함수는 exit를 호출한다는 점을 제외하면 warn과 똑같이 작동합니다. 일반 스크립트 내에서이 함수는 실행을 즉시 종료하는 효과가 있습니다. 이 기능은 프로그램에 오류가있을 경우 계속 진행해도 소용이 없을 경우에 사용해야합니다.
chdir('/etc') or die "Can't change directory";
모듈 내의 오류
우리가 처리 할 수있는 두 가지 상황이 있습니다.
모듈의 파일 이름과 줄 번호를 인용하는 모듈의 오류보고-이는 모듈을 디버깅 할 때 또는 스크립트 관련이 아닌 모듈 관련 오류를 구체적으로 발생시키려는 경우에 유용합니다.
오류를 일으킨 스크립트 내에서 행을 디버그 할 수 있도록 호출자의 정보를 인용하는 모듈 내의 오류를보고합니다. 이러한 방식으로 발생한 오류는 호출 스크립트의 시작 줄과 관련하여 오류를 강조하기 때문에 최종 사용자에게 유용합니다.
그만큼 warn 과 die함수는 모듈 내에서 호출 될 때 예상하는 것과 약간 다르게 작동합니다. 예를 들어, 간단한 모듈-
package T;
require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp;
sub function {
warn "Error in module!";
}
1;
아래와 같은 스크립트에서 호출하면-
use T;
function();
다음 결과가 생성됩니다-
Error in module! at T.pm line 9.
이것은 당신이 예상했던 것과 다소 차이가 있지만 반드시 원하는 것은 아닙니다. 모듈 프로그래머의 관점에서이 정보는 모듈 자체 내의 버그를 가리키는 데 도움이되기 때문에 유용합니다. 최종 사용자에게 제공된 정보는 상당히 쓸모가 없으며, 강화 된 프로그래머를 제외한 모든 사람에게는 완전히 무의미합니다.
이러한 문제에 대한 해결책은 호출 스크립트에 대한 정보를 반환하는 모듈 내에서 오류를보고하는 단순화 된 방법을 제공하는 Carp 모듈입니다. Carp 모듈은 carp, cluck, croak, confess의 네 가지 기능을 제공합니다. 이러한 기능은 아래에서 설명합니다.
잉어 기능
carp 함수는 warn과 기본적으로 동일하며 실제로 스크립트를 종료하고 스크립트 이름을 인쇄하지 않고 메시지를 STDERR에 인쇄합니다.
package T;
require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp;
sub function {
carp "Error in module!";
}
1;
아래와 같은 스크립트에서 호출하면-
use T;
function();
다음 결과가 생성됩니다-
Error in module! at test.pl line 4
cluck 기능
cluck 함수는 일종의 슈퍼 차지 잉어입니다. 동일한 기본 원리를 따르지만 원래 스크립트에 대한 정보를 포함하여 호출되는 함수로 이어진 모든 모듈의 스택 추적을 인쇄합니다.
package T;
require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp qw(cluck);
sub function {
cluck "Error in module!";
}
1;
아래와 같은 스크립트에서 호출하면-
use T;
function();
다음 결과가 생성됩니다-
Error in module! at T.pm line 9
T::function() called at test.pl line 4
croak 기능
그만큼 croak 함수는 다음과 같습니다. die, 단 한 단계 위로 발신자를보고한다는 점만 다릅니다. die와 마찬가지로이 함수는 STDERR에 오류를보고 한 후 스크립트를 종료합니다.
package T;
require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp;
sub function {
croak "Error in module!";
}
1;
아래와 같은 스크립트에서 호출하면-
use T;
function();
다음 결과가 생성됩니다-
Error in module! at test.pl line 4
잉어와 마찬가지로 경고 및 다이 기능에 따른 줄 및 파일 정보 포함에 대해서도 동일한 기본 규칙이 적용됩니다.
고백 기능
그만큼 confess 기능은 같다 cluck; die를 호출 한 다음 원본 스크립트까지 스택 추적을 인쇄합니다.
package T;
require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp;
sub function {
confess "Error in module!";
}
1;
아래와 같은 스크립트에서 호출하면-
use T;
function();
다음 결과가 생성됩니다-
Error in module! at T.pm line 9
T::function() called at test.pl line 4