오류 제어 연산자
오류 제어 연산자
PHP에는 오류를 제어하는 연산자가 하나 있어요. 바로 골뱅이(@) 기호인데, 표현식 앞에 붙이면 그 표현식에서 발생할 수 있는 진단 오류를 모두 억제해 줘요.
본문
PHP는 오류 제어 연산자를 하나 지원해요. 바로 골뱅이(@) 기호예요. PHP에서 어떤 표현식 앞에 @를 붙이면, 그 표현식이 만들어낼 수 있는 진단 오류가 모두 억제돼요.
set_error_handler()로 커스텀 오류 처리 함수를 등록해 두었다면, 진단이 억제되었더라도 그 함수는 여전히 호출돼요.
Warning
PHP 8.0.0 이전에는 @ 연산자로 오류를 억제한 경우, 커스텀 오류 처리 함수 안에서 호출한 error_reporting()이 항상 0을 반환했어요. PHP 8.0.0부터는 다음 (비트) 표현식의 값을 반환해요: E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR | E_USER_ERROR | E_RECOVERABLE_ERROR | E_PARSE
표현식이 만들어내는 모든 오류 메시지는 error_get_last()가 반환하는 배열의 "message" 요소에서 확인할 수 있어요. 이 함수의 결과는 오류가 발생할 때마다 바뀌므로, 가능하면 빨리 확인해야 해요.
Example #1 의도적인 파일 오류
<?php
$my_file = @file ('non_existent_file') or
die ("Failed opening file: error was '" . error_get_last()['message'] . "'");
?>
Example #2 표현식 억제하기
<?php
// this works for any expression, not just functions:
$value = @$cache[$key];
// will not issue a notice if the index $key doesn't exist.
?>
Note:
@ 연산자는 오직 표현식에만 동작해요. 대략적인 규칙을 하나 기억해 두면 돼요. 어떤 것의 값을 구할 수 있다면 그 앞에 @ 연산자를 붙일 수 있어요. 예를 들어 변수, 함수 호출, 일부 언어 구조 호출(예: include) 등에 붙일 수 있어요. 반면 함수나 클래스 정의, 혹은 if나 foreach 같은 조건 구조에는 붙일 수 없어요.
Warning
PHP 8.0.0 이전에는 @ 연산자가 스크립트 실행을 종료시키는 치명적 오류까지 막아버릴 수 있었어요. 예를 들어 존재하지 않거나 오타가 있는 함수 호출 앞에 @를 붙이면, 스크립트는 왜 종료됐는지 아무 단서도 없이 끝나 버렸어요.
더 알아보기
- error_reporting()
- 오류 처리 및 로깅 함수(Error Handling and Logging functions)