PHP에는 다음과 같은 여러 에러와 경고 형태가 있다.:
표 16-1. PHP error types
Value | Constant | Description | Note |
---|---|---|---|
1 | E_ERROR | Normal Function Errors (일반적인 에러) | |
2 | E_WARNING | Normal Warnings (일반적인 경고) | |
4 | E_PARSE | Parser Errors (문법 에러) | |
8 | E_NOTICE | Notices (알림-무시할 수 있는 알림이지만 버그의 가능성을 가지고 있는 경우) | |
16 | E_CORE_ERROR | fatal errors that occur during PHP's initial startup (PHP가 처음 시작될 때 발생한 치명적 에러) | PHP 4 only |
32 | E_CORE_WARNING | warnings (non fatal errors) that occur during PHP's initial startup (PHP가 처음 시작될 때 발생한 치명적이지 않은 경고) | PHP 4 only |
64 | E_COMPILE_ERROR | fatal compile-time errors (컴파일시 생긴 치명적 에러) | PHP 4 only |
128 | E_COMPILE_WARNING | compile-time warnings (non fatal errors) (컴파일시 발생한 치명적이지 않은 경고) | PHP 4 only |
256 | E_USER_ERROR | user-generated error message (사용자가 만든 에러 메세지) | PHP 4 only |
512 | E_USER_WARNING | user-generated warning message (사용자가 만든 경고 메세지) | PHP 4 only |
1024 | E_USER_NOTICE | user-generated notice message (사용자가 만든 알림 메세지) | PHP 4 only |
E_ALL | all of the above, as supported (지원가능한 위의 것 모두) |
위의 값(숫자, 상수 모두)은 레포트하기 원하는 내용의 비트를 설정하기 위해 조합하여 사용할 수 있다. 원하는 값을 조합해내기 위해 bitwise operators에 있는 비트 조작 연산자를 사용한다. 단 php.ini 파일에서는 '|', '~', '!', '&'의 네개의 연산자만 사용가능하고, php3.ini에서는 어떤 비트단위 연산자도 사용할 수 없다.
PHP4에서 error_reporting의 기본값은 E_ALL & ~E_NOTICE이다. 즉, 모든 에러와 경고를 출력하지만 알림(notice)는 레포팅하지 않는다. PHP3에서의 기본값은 (E_ERROR | E_WARNING | E_PARSE)이다. 내용적으로는 PHP4와 같다. PHP3의 php3.ini에서는 상수를 사용한 설정을 사용할 수 없으므로, error_reporting의 값은 반드시 숫자여야 한다. 그러므로 기본값은 7이다.
초기 설정은 ini 파일에 있는 error_reporting 지시자를 사용하여 변할 수 있고, 아파치의 httpd.conf파일에서 php_error_reporting (PHP3에서는 php3_error_reporting) 지시자를 사용하여 설정할 수도 있다. 또한, 스크립트 실행중에 error_reporting() 함수를 사용하여 설정할 수도 있다.
주의 |
PHP3에서 PHP4로 프로그램 코드나 서버 자체를 이전할 경우, 이 설정과 error_reporting() 함수의 호출 내역을 반드시 확인하거나, E_COMPILE_ERROR를 포함한 새로운 에러 타입에 대한 레포팅을 불가능하게 하여야 한다. 자칫하면 어떤 문제가 어디서 발생했는가에 대한 정보없이 빈 문서를 만들어 낼 수도 있으므로 주의하자. |
모든 PHP 표현식(expression)은 "@"를 앞에 붙이고 호출되면 error reporting을 하지 않는다. 만약 track_errors 옵션이 Enabled로 되어 있고 해당 문장에서 에러가 발생했다면, $php_errormsg 라는 전역변수에 에러 메시지가 담겨 있게 된다. 그러나 @ error-control operator라도 문법 에러의 경우에는 에러 메세지를 disable로 하지 못한다.
주의 |
현재 @ error-control operator 선행자(prefix)는 스크립트를 중단시킬 정도의 치명적인 에러에 대해서도 에러 레포팅을 하지 않게 한다. 특히 @이 특정 함수의 에러레포팅을 억제 하려고 사용된 경우에, 이 함수가 존재 하지 않거나, 이름을 잘못 쓴 경우 해당 스크립트는 아무런 이유를 표시하지 않고 죽어버리게 된다. |
아래에 PHP에서 에러를 다루는 기능에 대한 사용 예를 적어 놓았다. 이 예에서 우리는 파일로(XML 포맷을 사용) 해당 정보의 로그를 남기고, 논리적인 문제로 치명적인 에러가 생긴경우는 개발자에게 e-mail을 보내는 에러 핸들링 함수를 정의하였다.
Error Handling and Logging functions에 있는 함수들을 어떻게 사용하는 가를 보여주는 간단한 예이다.See also error_reporting(), error_log(), set_error_handler(), restore_error_handler(), trigger_error(), user_error()