Perl에서 오류 처리는 전통적으로 die, warn 함수와 eval 블록을 사용하여 수행됩니다. 프로그램을 올바르게 종료하기 위해, 심각한 오류에 대해서는 die를 사용하고, 경고에 대해서는 warn 함수를 사용하는 것이 좋습니다. 두 번째 방법은 블록 연산자 eval을 사용하여 치명적인 오류를 포착한 후 이를 처리하는 것입니다.
예시:
open my $fh, '<', 'file.txt' or die "파일을 열 수 없습니다: $! "; printf $fh "안녕하세요" or warn "쓰지 못했습니다: $! "; # eval을 통한 오류 처리 my $result = eval { risky_function(); 1; }; unless ($result) { print "오류가 감지되었습니다: $@ "; }
또한 Perl에 대한 try/catch을 구현하는 Try::Tiny 및 Error와 같은 모듈도 존재합니다.
eval {}와 문자열 eval "..." 사용의 차이는 무엇이며 각 방법의 숨은 위험은 무엇인가요?
많은 사람들이 이 두 가지가 동일하다고 착각합니다.
eval { ... }는 블록 try/catch로 작동하고,eval "..."는 실행 시간에 Perl 코드로 문자열을 컴파일하고 실행합니다. 문자열을 사용할 때는 오류를 쉽게 발생시킬 수 있으며 SQL 인젝션 또는 컴파일 오류에 노출될 수 있습니다.
예시 차이점:
# 문자열을 Perl 코드로 컴파일하고 실행합니다. my $var = 'my $x = 2 + 2'; eval $var; # eval 더러운 방식! # 안전한 블록 방식 my $error = eval { die "실패"; }; print $@ if $@;
이야기
한 프로젝트에서 개발자들이 동적 명령어 생성을 위해 eval "코드"를 사용하였고, 이로 인해 실행 시간에 접근할 수 없는 구문 오류와 디버깅 문제를 초래했습니다.
이야기
부적절한 오류 포착: 로컬 변수를 사용하는 eval 내부에서 발생한 예외는 $@가 후속 함수 log 호출로 인해 덮어져 처리되지 않았습니다.
이야기
구식 코드에서는 try/catch 대신 오직 die() 만을 사용하여 Perl 프로세스의 비관리적 종료와 데이터베이스 트랜잭션의 데이터 손실을 초래했습니다.