PHP Error Handling
PHP 에서 기본 오류처리는 아주 간단하다. 파일 명, 행 번호와 오류를 설명하는 에러 메시지가 브라우저로 전송된다.
PHP Error Handling
스크립트와 웹 어플리케이션을 만들 때, 오류 처리는 중요한 부분이다. 만일 당신의 코드에서 오류검사 코드가 부족하다면, 당신의 코드는 매우 프로답지 않아 보이고, 보안 위험에 노출되게 된다.
이 튜토리얼은 PHP 에서 가장 흔한 오류검사 방법 중의 일부를 소개하며, 이들의 오류처리 방법들을 설명합니다.:
- 간단한 "die()" 문장
- 사용자 지정 errors 와 error triggers
- 오류 보고
Basic Error Handling: die() 함수 사용
첫 번째 예는 텍스트 파일을 여는 간단한 스크립트를 보여준다.:
<?php
$file=fopen("welcome.txt","r");
?>
파일이 존재 하지 않을 경우, 다음과 같은 에러가 발생할 수 있습니다.:
Warning: fopen(welcome.txt) [function.fopen]: failed
to open stream:
No such file or directory in C:\webfolder\test.php on
line 2
위와 같은 에러 메시지가 나타나는 것을 방지하기 위해서, 우리는 그것을 접근하기 전에 파일이 존재하는지 여부를 시험합니다. :
<?php
if(!file_exists("welcome.txt")) {
die("File not found");
} else {
$file=fopen("welcome.txt","r");
}
?>
이제 파일이 존재하지 않을 경우, 다음과 같은 에러가 발생합니다. :
File not found
위의 코드가, 에러 후에 스크립트를 멈추기 위한 간단한 오류처리 메커니즘을 사용하기 때문에, 이전의 코드보다 더 효율적입니다.
그러나, 단순히 스크립트를 멈추는 것이 항상 옳은 방법은 아니다. 오류 처리를 위한 또 다른 PHP 함수를 살펴보자.
Creating a Custom Error Handler
사용자 지정 오류 처리기를 생성하는 것은 매우 간단하다. 이는 단순히 PHP 에서 오류가 발생했을 때 호출될 수 있는 특별한 함수를 생성하면 된다.
이 함수는 적어도 두 개의 매개변수(error level 과 error message)를 처리 할 수 있어야 하지만, 5개 까지의 매개변수(optionally: file, line-number, 와 the error context)를 수용할 수 있어야 한다. :
Syntax
error_function(error_level,error_message,
error_file,error_line,error_context)
Parameter | Description |
---|---|
error_level | Required. Specifies the error report level for the user-defined error. Must be a value number. See table below for possible error report levels |
error_message | Required. Specifies the error message for the user-defined error |
error_file | Optional. Specifies the filename in which the error occurred |
error_line | Optional. Specifies the line number in which the error occurred |
error_context | Optional. Specifies an array containing every variable, and their values, in use when the error occurred |
Error Report levels
오류 보고 레벨은 사용자 정의 오류처리기( user-defined error handler) 가 가질 수 있는 에러의 서로 다른 유형들을 말한다.:
Value | Constant | Description |
---|---|---|
2 | E_WARNING | Non-fatal run-time errors. Execution of the script is not halted |
8 | E_NOTICE | Run-time notices. The script found something that might be an error, but could also happen when running a script normally |
256 | E_USER_ERROR | Fatal user-generated error. This is like an E_ERROR set by the programmer using the PHP function trigger_error() |
512 | E_USER_WARNING | Non-fatal user-generated warning. This is like an E_WARNING set by the programmer using the PHP function trigger_error() |
1024 | E_USER_NOTICE | User-generated notice. This is like an E_NOTICE set by the programmer using the PHP function trigger_error() |
4096 | E_RECOVERABLE_ERROR | Catchable fatal error. This is like an E_ERROR but can be caught by a user defined handle (see also set_error_handler()) |
8191 | E_ALL | All errors and warnings (E_STRICT became a part of E_ALL in PHP 5.4) |
이제, 오류를 처리하는 함수를 만들자.:
function customError($errno, $errstr) {
echo "<b>Error:</b> [$errno]
$errstr<br>";
echo "Ending Script";
die();
}
위의 코드는 단순한 오류 처리 함수 이다. 트리거 될 때, 에러 레벨과 에러 메시지를 얻는다. 그리고 에러 레벨과 에러 메시지를 출력한 후 스크립트를 종료한다.
이제 오류 처리 함수를 만들었으므로, 언제 트리거될지 결정해야한다.
Set Error Handler
PHP 의 기본 오류 처리기는 내장된 오류 처리기이다. 우리는 스크립트의 지속기간 동안 위의 함수를 기본 오류처리기로 할 것이다.
단지 특정한 오류에만 적용되도록, 그리하여스크립트가 다른 에러를 다른 방법으로 처리할 수 있도록, 오류처리기를 변경하는 것이 가능하다. 그러나, 이 예에서는 모든 오류에 대해 우리의 사용자 지정 오류 처리기를 사용한다.:
set_error_handler("customError");
우리의 사용자 지정 함수가 모든 오류를 처리하기 원하므로, set_error_handler() 는 단지 하나의 매개변수만 필요하고, 두 번째 매개변수는 에러베벨을 지정하기 위해 추가 될 수 있다.
Example
존재 하지 않는 변수를 출력하려는 시도로 에러처리기 시험:
<?php
//error handler function
function customError($errno, $errstr) {
echo "<b>Error:</b> [$errno] $errstr";
}
//set error handler
set_error_handler("customError");
//trigger error
echo($test);
?>
위의 코드의 출력은 다음과 같아야 한다:
Error: [8] Undefined variable: test
Trigger an Error
사용자가 데이타를 입력할 수 있는 스크립트에서는 잘못된 입력이 발생했을 때 에러를 트리거하는 것이 유용하다. PHP 에서는, 이것이 trigger_error() 함수로 수행된다.
Example
이 예에서는 "test" 변수가 "1" 보다 크면 에러가 발생한다. :
<?php
$test=2;
if ($test>1) {
trigger_error("Value must be 1 or below");
}
?>
위 코드의 출력은 다음과 같아야 한다.:
Notice: Value must be 1 or below
in C:\webfolder\test.php on line 6
오류는 스크립트에서 원하는 어디에서든지 트리거될 수 있다, 그리고 두 번째 매개변수를 추가하면, 어떤 오류 수준이 트리거 될 지도 지정할 수 있다.
가능한 에러 유형:
- E_USER_ERROR - 치명적 사용자-생성 런타임 에러. 복구 될 수 없는 에러. 스크립트의 실행이 중지됨.
- E_USER_WARNING - 비-치명적 사용자-생성 런타임 경고, 스크립트의 실행이 중단되지 않음
- E_USER_NOTICE - 기본. 사용자-생성 런타임 통지. 스크립트는 에러일 수도 있는 것을 발견하지만, 일반적으로 스크립트를 실행할 때도 발생할 수 있음.
Example
이 예에서는 "test" 변수가 "1" 보다 크면 E_USER_WARNING 가 발생합니다. E_USER_WARNING 가 발생하면, 우리는 사용자 지정 에러 처리기를 사용하고, 스크립트를 종료합니다.:
<?php
//error handler function
function customError($errno, $errstr) {
echo "<b>Error:</b> [$errno]
$errstr<br>";
echo "Ending Script";
die();
}
//set error handler
set_error_handler("customError",E_USER_WARNING);
//trigger error
$test=2;
if ($test>1) {
trigger_error("Value must be 1 or
below",E_USER_WARNING);
}
?>
위 코드의 출력은 다음과 같아야 한다:
Error: [512] Value must be 1 or below
Ending Script
이제 우리는 우리 자신의 오류 생성과 그것을 어떻게 트리거하는지를 배웠으니, 오류기록(error logging)을 보자.
Error Logging
기본적으로, PHP는 php.ini 파일에 설정된 error_log 구성(configuration)에 따라서 서버의 로깅시스템 또는 파일에 오류로그(error log)를 보낸다. error_log() 함수를 사용하여 지정된 파일 또는 원격 대상(destination)에 오류로그를 보낼 수 있다.
이-메일로 자신에게 오류메시지를 전송하는 것은 특정오류가 발생했는지를 연락받는 좋은 방법이다.
Send an Error Message by E-Mail
아래의 예에서특정 에러가 발생하면 오류메시지를 이메일로 보내고 스크립트를 종료한다.:
<?php
//error handler function
function customError($errno, $errstr) {
echo "<b>Error:</b> [$errno]
$errstr<br>";
echo "Webmaster has been notified";
error_log("Error: [$errno] $errstr",1,
"someone@example.com","From:
webmaster@example.com");
}
//set error handler
set_error_handler("customError",E_USER_WARNING);
//trigger error
$test=2;
if ($test>1) {
trigger_error("Value must be 1 or
below",E_USER_WARNING);
}
?>
위 코드의 출력은 다음과 같아야 한다:
Error: [512] Value must be 1 or below
Webmaster has been notified
그리고, 위의 코드로 부터 받은 메일은 다음과 같다.:
Error: [512] Value must be 1 or below
이는 모든 에러와는 사용될 수 없고, 보통의 에러는 기본 PHP 로깅시스템을 사용하여 서버에 로그되어야 한다.