프로그램을 실행하는 동안 존재하지 않는 파일을 여는 등의 다양한 오류가 항상 발생합니다.
프로그램 실행 중에 오류가 발생하면 오류를 방지하고 프로그램이 종료되는 것을 방지하기 위해 몇 가지 감지 방법을 사용해야 합니다.
Perl은 오류를 처리하는 여러 가지 방법을 제공하며, 다음에 하나씩 소개하겠습니다.
if 문은 문의 반환 값을 결정할 수 있습니다. 예는 다음과 같습니다.
if(open(DATA, $file)){ ...}else{ die "오류: 파일을 열 수 없습니다 - $!";}
프로그램의 변수 $!에서 오류 메시지가 반환되었습니다. 위 코드를 다음 코드로 단순화할 수도 있습니다.
open(DATA, $file) || die "오류: 파일을 열 수 없습니다 - $!";
Except 함수는 if의 반대이며 아래와 같이 표현식이 false를 반환할 때만 실행됩니다.
Except(chdir("/etc")){ die "오류: 디렉토리를 열 수 없습니다 - $!";}
Unsell 문은 오류 알림을 설정하려는 경우 매우 유용합니다. 위의 코드를 다음과 같이 단축할 수도 있습니다.
die "오류: 디렉토리를 열 수 없습니다!: $!"
위의 오류 메시지는 디렉터리 전환에 오류가 있는 경우에만 출력됩니다.
다음은 삼항 연산자의 간단한 예입니다.
print(exists($hash{value}) ? '존재함' : '존재하지 않습니다.',"n");
위의 예에서는 해시 값이 존재하는지 확인하기 위해 삼항 연산자를 사용했습니다.
이 예에는 표현식? 값 1: 값 2 형식의 두 값이 있는 표현식이 포함되어 있습니다.
경고 기능은 경고 메시지를 트리거하는 데 사용됩니다. 다른 작업은 수행되지 않습니다. 이는 일반적으로 사용자에게 메시지를 표시하는 데 사용됩니다.
chdir('/etc') 또는 "디렉토리를 전환할 수 없습니다"라고 경고합니다.
die 함수는 warning과 유사하지만 종료됩니다. 일반적으로 오류 메시지의 출력으로 사용됩니다.
chdir('/etc') 또는 die "디렉토리를 전환할 수 없습니다";
Perl 스크립트에서 오류를 보고하는 일반적인 방법은 warning() 또는 die() 함수를 사용하여 오류를 보고하거나 생성하는 것입니다. Carp 모듈의 경우 특히 모듈 내에서 생성된 메시지에 대한 추가 제어 수준을 제공할 수 있습니다.
표준 Carp 모듈은 오류 지역화를 제공하는 데 더 유익하고 사용자 친화적인 warning() 및 die() 함수에 대한 대안을 제공합니다. 모듈 내에서 사용될 경우 모듈 이름과 줄 번호가 오류 메시지에 포함됩니다.
carp 함수는 warning 함수와 유사하게 프로그램의 추적 정보를 출력할 수 있으며 일반적으로 이 정보를 STDERR로 보냅니다.
package T;require 내보내기;@ISA = qw/Exporter/;@EXPORT = qw/function/;use Carp;sub function { carp "모듈에 오류가 있습니다!";}1;
스크립트에서 다음 프로그램을 호출합니다.
T;function();을 사용하세요.
위 프로그램을 실행하면 출력 결과는 다음과 같습니다.
test.pl 라인 4에 오류가 있습니다!
cluck()은 warning()과 유사하며 오류가 발생한 위치에서 스택 추적을 제공합니다.
패키지 T;require 내보내기;@ISA = qw/Exporter/;@EXPORT = qw/function/;사용 Carp qw(cluck);sub function { cluck "Error in module!";}1;
스크립트에서 다음 프로그램을 호출합니다.
T;function();을 사용하세요.
위 프로그램을 실행하면 출력 결과는 다음과 같습니다.
T.pm 라인 9에서 모듈에 오류가 있습니다. test.pl 라인 4에서 T::function()이 호출되었습니다.
croak()는 die()와 마찬가지로 스크립트를 종료합니다.
package T;require Importer;@ISA = qw/Exporter/;@EXPORT = qw/function/;use Carp;sub function { croak "Error in module!";}1;
스크립트에서 다음 프로그램을 호출합니다.
T;function();을 사용하세요.
위 프로그램을 실행하면 출력 결과는 다음과 같습니다.
test.pl 라인 4에 오류가 있습니다!
Confess()는 die()와 유사하지만 오류가 발생한 위치에서 스택 추적을 제공합니다.
package T;requireExporter;@ISA = qw/Exporter/;@EXPORT = qw/function/;use Carp;sub function { Confess "Error in module!";}1;
스크립트에서 다음 프로그램을 호출합니다.
T;function();을 사용하세요.
위 프로그램을 실행하면 출력 결과는 다음과 같습니다.
T.pm 라인 9에서 모듈에 오류가 있습니다. test.pl 라인 4에서 T::function()이 호출되었습니다.