수색…


평가와 죽다

Try :: Tiny 같은 타사 라이브러리에 의존하지 않고 "예외"를 처리하는 기본 제공 방법입니다.

my $ret;

eval {
  $ret = some_function_that_might_die();
  1;
} or do {
  my $eval_error = $@ || "Zombie error!";
  handle_error($eval_error);
};

# use $ret

die 는 false 반환 값을 가지며 전체 코드 블록의 반환 값은 코드 블록의 마지막 표현식 값입니다.

  • $ret 가 성공적으로 할당되면 1; 표현식은 eval 코드 블록에서 마지막으로 발생하는 것입니다. 따라서 eval 코드 블록은 true 값을 가지므로 or do 블록이 실행되지 않습니다.
  • some_function_that_might_die()die , eval code 블록에서 마지막으로 발생하는 것이 die 입니다. 따라서 eval 코드 블록은 거짓 값을 가지며 or do 블록이 실행됩니다.
  • or do 블록에서 수행 해야 할 첫 번째 작업은 $@ 입니다. 이 전역 변수는 die 위해 전달 된 모든 인수를 보유합니다. || "Zombie Error" 가드가 일반적이지만 일반적으로 불필요합니다.

이것은 die를 호출하여 모든 코드가 실패하지는 않지만 일부 구조는 관계없이 사용될 수 있기 때문에 이해하는 것이 중요합니다. 다음을 리턴하는 데이터베이스 함수를 고려하십시오.

  • 성공에 영향을받는 행 수
  • 쿼리가 성공적이지만 영향을받은 행이없는 경우 '0 but true'
  • 쿼리가 성공적이지 않은 경우 0 입니다.

이 경우에도 같은 관용구를 사용할 수 있지만 마지막 1; 은 건너 뜁니다 1; ,이 함수 평가 절의 마지막 항목이어야합니다. 이 같은:

eval {
  my $value = My::Database::retrieve($my_thing); # dies on fail
  $value->set_status("Completed");
  $value->set_completed_timestamp(time());
  $value->update(); # returns false value on fail
} or do { # handles both the die and the 0 return value
  my $eval_error = $@ || "Zombie error!";
  handle_error($eval_error);
};


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow