Perl은 본래 시스템 관리용 스크립트 언어로 설계되었기 때문에 전통적인 오류 처리 모델은 더 절차적이었습니다. 그러나 시간이 지나면서 언어에는 예외 및 오류 처리를 위한 확장된 기술이 도입되었습니다.
초기 Perl 버전에서는 함수 반환값과 글로벌 변수 $!를 통해 오류를 포착했습니다. 이후 eval(동적 캡처) 구조가 추가되었고, Try::Tiny와 같은 모듈이 간결하고 안전한 try-catch 패턴을 도입했습니다.
표준 Perl에는 내장된 try-catch 구문이 없습니다. 오류는 Perl 코드 내에서도 발생할 수 있고 외부 호출에서도 발생할 수 있습니다(예: 파일 열기). 오류를 명시적으로 처리하지 않으면 프로그램은 예측할 수 없는 상태로 계속 실행될 수 있습니다. 오류 포착 기술은 컨텍스트, 애플리케이션의 복잡성 및 신뢰성에 대한 요구 사항에 따라 신중하게 선택해야 합니다.
eval 함수를 사용하여 잠재적으로 위험한 코드를 블록으로 감싸고 실행 후 $@의 내용을 분석하여 오류를 포착합니다.die를 사용합니다. 더 구체적인 오류 생성 및 이미 설명한 예외를 다시 발생시키는 것은 sinon 프레임워크를 통해 수행됩니다.코드 예시 — Try::Tiny를 통한 오류 처리:
use Try::Tiny; try { open my $fh, '<', 'file.txt' or die "파일을 열 수 없습니다: $!"; while (<$fh>) { print $_; } } catch { warn "오류가 발생했습니다: $_"; };
$@ 재작성 및 스코프 함정과 관련된 전형적인 오류를 피할 수 있습니다.어떤 경우에 eval 블록이 시스템 오류를 포착하지 않습니까?
Eval은 C 라이브러리에서 치명적으로 종료되는 경우(예: XS 코드에서 SEGFAULT)가 발생할 때 오류를 포착하지 않습니다. Eval은 Perl 치명적 오류에만 작동하며 C 확장에 의한 크래시와는 관련이 없습니다.
중첩된 eval 블록에서 $@ 변수는 어떻게 됩니까?
내부 eval에서 또 다른 eval을 호출하면 그 종료 시 $@의 값이 재설정됩니다. 따라서 각 eval 후에는 $@를 개별 변수에 저장하여 원본 오류를 잃어버리지 않도록 해야 합니다.
Try::Tiny 같은 보조 모듈이 catch/try 내에서 $@ 변수를 지역적으로 선언하는 이유는 무엇입니까?
Perl은 try (eval)에서 성공적으로 종료될 경우에만 $@를 자동으로 지웁니다. 오류가 발생하여 반환되거나 next, last 시 $@가 지워지지 않으면 다음 코드에서 "팬텀" 오류가 발생할 수 있습니다. Try::Tiny와 같은 모듈은 이를 위해 스코프 로컬 변수를 생성합니다.
예:
try { die "Boom!"; } catch { print "잡혔습니다: $_ "; # $_는 catch 내부에서 오류를 포착합니다. };
데이터 내보내기 처리기에서 데이터베이스에 연결하는 동안 오류가 eval을 통해 포착되지만 $@ 값이 저장되지 않고 로깅이 수행되지 않습니다. 다음 eval에서 또 다른 오류가 호출될 때 첫 번째 오류가 완전히 사라집니다.
장점:
단점:
중요한 섹션을 처리하기 위해 Try::Tiny를 사용하고 모든 오류를 별도의 로그에 기록하며, 원본 오류가 저장되고 화면에 올바르게 표시됩니다.
장점:
단점: