본문 바로가기

Script/Perl

23. Error Handling

 
If statement
 
기본적으로 아래와 같이 return 값을 바로 검사하는 방법이 있다.
 
if(open(DATA, $file)) {
   ...
else {
   die "Error: Couldn't open the file - $!";
}
 
Perl 은$! 라는 이름의 variable 에 리턴값을 저장하기 때문에
 
이런 경우 간단히 아래와 같이 사용할 수 있다.
 
open(DATA, $file) || die "Error: Couldn't open the file $!";
 
 
 
Unless statement
 
보통 아래와 같은 방식으로 아래와 같이 나타낼 수 있다.
 
unless(chdir("/etc")) {
   die "Error: Can't change directory - $!";
}
 
조건이 앞에 나와서 조금 이상하긴 한데 파싱할 때 이걸 제대로 한다는 거니깐 그냥 외우자.
 
die "Error: Can't change directory!: $!" unless(chdir("/etc"));
 
 
 
삼항 statement
 
operator? 를 사용해 간단히 print 하는 예이다.
 
print(exists($hash{value}) ? 'There' : 'Missing',"\n");
 
 
 
warn function
 
이 함수는 STDERR 을 프린트하지만 다른 액션을 취하지 않아서 
 
내가 원하는 warning 메시지를 출력할 때 사용하면 된다.
 
chdir('/etc') or warn "Can't change directory";
 
 
 
 
die function
 
warn 함수와 비슷하지만 다른 점은 exit 를 즉시 호출한다는 점이다.
 
이 경우 프로그램은 바로 중단되게 된다.
 
chdir('/etc') or die "Can't change directory";
 
 
 
 
carp 
 
carp 은 라인 정보만 리턴하는데 carp 는 call stack 정보도 리턴한다. 
 
exit 함수를 부르지 않는다.
 
package T;
 
require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp;
 
sub function {
   carp "Error in module!";
}
1;
 
function();
  

Output
 
Error in module! at C:/EclipseProject/fileCompare/test5.pl line 9 .
   T::function() called at C:/EclipseProject/fileCompare/test5.pl line 13
 
 
 
 
warn in package
 
같은 함수라도 modules 에서 사용하면 달라진다.
 
아래와 같은 코드가 있다고 보자.
 
package T;
 
require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp;
 
sub function {
   warn "Error in module!";
}
1;
 
function();
 

Output
 
Error in module! at C:/EclipseProject/fileCompare/test5.pl line 9 .
 
 
결과는 위와 같다.
 
기본 warn 함수와 달리 어떤 파일의 어떤 라인에서 문제가 있는지 보여준다. 
 
 
 
croak in package
 
warn 대신 사용할 만한 함수는 아래와 같다. 
 
경우에 맞게 사용하면 된다. Backtrace 는 Call Stack 을 의미한다.
 
          Abort   Backtrace
carp       N        N
cluck      N        Y
croak      Y        N
confess    Y        Y
 #!/usr/bin/perl
 
 package Warning ;
 
  sub warning {
    warn "warn";
  }
 
 package CWarn ;
 
  use Carp qw(carp cluck);
 
  sub carping {
    carp "carp";
  }
 
  sub clucking {
    cluck "cluck";
  }
 
 package Fatal ;
 
  use Carp qw(confess croak);
 
  sub croaking {
       croak "croak";
  }
 
   sub confessing {
       confess "confess";
  }
 
 package main ;
 
  Warning::warning();
  CWarn::carping();
  CWarn::clucking();
  Fatal::croaking();
  #Fatal::confessing();
 
 
 
 

'Script > Perl' 카테고리의 다른 글

24. Perl Debugging  (0) 2020.01.21
22. Excel  (0) 2020.01.21
21. Directory  (0) 2020.01.21
20. System  (0) 2020.01.21
19. File  (0) 2020.01.21