English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
이 튜토리얼에서는 PHP의 오류 처리 기능을 사용하여 오류 상황을 고전적으로 처리하는 방법을 배웁니다.
때때이상 애플리케이션이 정상적으로 실행되지 않아 오류가 발생할 수 있습니다. 오류를 일으킬 수 있는 여러 가지 원인이 있습니다. 예를 들어:
웹 서버의 디스크 공간이 부족할 수 있습니다
사용자가 양식 필드에 무효한 값을 입력할 수 있습니다
접근하려는 파일이나 데이터베이스 레코드가 존재하지 않을 수 있습니다
애플리케이션은 디스크에 파일을 쓸 권한이 없을 수 있습니다
애플리케이션이 접근할 수 있는 서비스가 일시적으로 사용할 수 없을 수 있습니다
이러한 유형의 오류는 스크립트 실행 중에 발생하기 때문에 실행 시간 오류라고 합니다. 스크립트 실행 전에 수정해야 할 문법 오류와는 다릅니다.
전문적인 애플리케이션은 이러한 실행 시간 오류를 적절히 처리할 수 있는 기능을 가지고 있어야 합니다. 일반적으로 이는 사용자에게 명확하고 정확하게 문제가 무엇인지 알려주는 것을 의미합니다.
일반적으로 스크립트가 정상적으로 실행되지 못하게 만드는 문제가 발생하면 PHP 엔진이 오류를 트리거합니다. 각 오류는 정수 값과 관련된 상수로 표현됩니다. 다음 표는 일부 일반적인 오류 등급을 나열합니다:
오류 등급 | 값 | 설명 |
---|---|---|
E_ERROR | 1 | 결정적인 실행 시간 오류입니다. 복구할 수 없습니다. 스크립트의 실행은 즉시 중단됩니다. |
E_WARNING | 2 | 실행 시간 경고입니다. 이는 결정적인 오류가 아니며 대부분의 오류가 이 범주에 포함됩니다. 스크립트의 실행은 중단되지 않습니다. |
E_NOTICE | 8 | 실행 시간 알림입니다. 스크립트가 오류가 발생할 수 있는 상황을 만났음을 나타냅니다. 하지만 이 상황이 스크립트가 정상적으로 실행될 때도 발생할 수 있습니다. |
E_USER_ERROR | 256 | 사용자가 생성한 결정적인 오류 메시지입니다. 이는 E_ERROR과 유사하지만 PHP 스크립트가 trigger_error() 함수를 사용하여 PHP 엔진이 생성한 것이 아닌 것입니다. |
E_USER_WARNING | 512 | 사용자가 생성한 비致命적인 경고 메시지입니다. 이는 E_WARNING과 유사하지만 PHP 스크립트가 trigger_error() 함수를 사용하여 PHP 엔진이 생성한 것이 아닌 것입니다. |
E_USER_NOTICE | 1024 | 사용자가 생성한 알림 메시지입니다. 이는 E_NOTICE와 유사하지만 PHP 스크립트가 trigger_error() 함수를 사용하여 PHP 엔진이 생성한 것이 아닌 것입니다. |
E_STRICT | 2048 | 실제로는 오류가 아니지만 PHP가 문제가 발생할 수 있는 또는 상호 불일치가 발생할 수 있는 코드를 만나면 트리거됩니다 |
E_ALL | 8191 | 모든 오류와 경고, PHP 5.4.0 이전의 E_STRICT을 제외. |
더 많은 오류 수준에 대해, 관련 문서를 참조하세요.PHP 오류 수준참조.
PHP 스크립트가 문제를 만날 때마다 PHP 엔진이 오류를 트리거하지만, 사용자가 더 사용자 친화적인 오류 메시지를 생성하기 위해 오류를 직접 트리거할 수도 있습니다. 이렇게 하면 응용 프로그램을 더 복잡하게 만들 수 있습니다. PHP 오류 처리를 위해 일반적으로 사용되는 몇 가지 방법에 대해 다음에 설명합니다:
다음 예제를 고려해 보세요. 이 예제는 단지 텍스트 파일을 읽기 전용으로 열려고 시도합니다.
<?php //불存在的文件尝试打开 $file = fopen("sample.txt", "r"); ?>
파일이 없을 경우, 다음과 같은 오류를 받을 수 있습니다:
경고: fopen(sample.txt) [function.fopen]: 파일이나 디렉토리가 존재하지 않습니다: C:\wamp\www\project\test.php line 2
이러한 오류 메시지를 사용자가 받지 않도록了一些简单的步骤,则可以防止用户收到此类错误消息。
<?php if(file_exists("sample.txt")){ $file = fopen("sample.txt", "r"); } else { die("오류: 접근하려는 파일이 존재하지 않습니다."); } ?>
위 스크립트를 실행하면 다음과 같은 오류 메시지를 받게 됩니다:
오류: 접근하려는 파일이 존재하지 않습니다.
그렇게 보면, 파일이 존재하는지 간단한 확인을 통해 사용자에게 더 의미 있는 오류 메시지를 생성할 수 있습니다.
“sample.txt” 파일이 없을 경우, 위에서 사용한 die() 함수는 단지 사용자 정의 오류 메시지를 표시하고 현재 스크립트를 종료합니다.
PHP 엔진이 생성하는 실행 시 오류를 처리하기 위해 자신의 오류 처리 함수를 생성할 수 있습니다. 사용자 정의 오류 처리 프로그램은 더 큰 유연성과 오류에 대한 더 나은 통제를 제공하며, 오류를 확인하고 오류 처리 방법을 결정할 수 있습니다. 사용자에게 메시지를 표시하거나 파일이나 데이터베이스에 오류를 기록하거나 이메일을 통해 전송하거나 문제를 해결하고 스크립트 실행을 계속하거나 스크립트 실행을 종료하거나 오류를 완전히 무시할 수 있습니다.
사용자 정의 오류 처리 함수는 최소한 두 개의 매개변수 (errno와 errstr)를 처리해야 하지만, 다른 세 개의 매개변수 (errfile, errline, errcontext)를 받을 수 있습니다. 다음과 같이 설명됩니다:
파라미터 | 설명 |
---|---|
필수 - 다음 파라미터는 필수입니다 | |
errno | 오류 수준을 정수로 지정합니다. 이는 적절한 오류 수준 상수(E_ERROR, E_WARNING 등)와 일치합니다 |
errstr | 오류 메시지를 문자열로 지정 |
선택 사항 - 다음 파라미터는 선택 사항입니다 | |
errfile | 오류가 발생한 스크립트 파일의 이름을 문자열로 지정 |
errline | 오류가 발생한 행 번호를 문자열로 지정 |
errcontext | 오류가 발생할 때 존재하는 모든 변수와 그 값이 포함된 배열을 지정합니다. 디버깅에 유용합니다 |
다음은 간단한 사용자 정의 오류 처리 함수 예제입니다. 무엇이든 오류가 발생하면 이 처리기를 trigge
<?php //오류 처리 함수 function customError($errno, $errstr){ echo "<b>Error:</b> [$errno] $errstr"; } ?>
PHP가 사용자 정의 오류 처리 함수를 사용하도록 알려야 합니다-내장된 set_error_handler() 함수를 호출하고 함수 이름을 전달하면 됩니다。
<?php //오류 처리 함수 function customError($errno, $errstr){ echo "<b>Error:</b> [$errno] $errstr"; } //오류 처리기를 설정 set_error_handler("customError"); //오류 발생 echo($test); ?>
오류의 상세 정보를 다음과 같이 로그 파일에 기록할 수 있습니다:
<?php function calcDivision($dividend, $divisor) { if($divisor == 0) { trigger_error("calcDivision(): 除数不能为零", E_USER_WARNING); return false; } else { return($dividend / $divisor); } } function customError($errno, $errstr, $errfile, $errline, $errcontext){ $message = date("Y-m-d H:i:s - "); $message .= "에러: [" . $errno ."], " . "$errstr in $errfile on line $errline, "; $message .= "변수들:" . print_r($errcontext, true) . "\r\n"; error_log($message, 3, "logs/app_errors.log"); die("문제가 발생했습니다. 다시 시도하세요。"); } set_error_handler("customError"); echo calcDivision(10, 0); echo "이 메시지는 절대 출력되지 않습니다。"; ?>
도 같은 error_log() 함수를 사용하여 오류 상세 정보를 포함한 이메일을 보낼 수 있습니다。
<?php function calcDivision($dividend, $divisor) { if ($divisor == 0){ trigger_error("calcDivision(): 除数不能为零", E_USER_WARNING); return false; } else { return($dividend / $divisor); } } function customError($errno, $errstr, $errfile, $errline, $errcontext){ $message = date("Y-m-d H:i:s - "); $message .= "에러: [" . $errno ."], " . "$errstr in $errfile on line $errline, "; $message .= "변수들:" . print_r($errcontext, true) . "\r\n"; error_log($message, 1, "[email protected]"); die("문제가 발생했습니다. 다시 시도하세요. 오류 보고서는 웹마스터에게 제출되었습니다."); } set_error_handler("customError"); echo calcDivision(10, 0); echo "이 내용은 출력되지 않습니다."; ?>
PHP 엔진이 스크립트 문제를 만날 때 오류를 발생시키지만, 여러분도 오류를 발생시킬 수 있습니다. 이는 가능한 문제가 심각한 오류로 발전하기 전에 문제를 표시하는 데 도움이 됩니다.
스크립트 내에서 오류를 발생시키려면 trigger_error() 함수를 호출하고 생성할 오류 메시지를 전달하세요:
trigger_error("문제가 발생했습니다.");
다음은 두 숫자를 분할하는 함수를 고려해 보겠습니다.
<?php function calcDivision($dividend, $divisor) { return($dividend / $divisor); } //함수 호출 echo calcDivision(10, 0); ?>
0 값을 $divisor 매개변수로 전달하면 PHP 엔진이 생성하는 오류는 다음과 유사합니다:
경고: C:\wamp\www\project\test.php 파일의 line에서 0으로의 분할 3
이 메시지는 내용이 많지 않아 보입니다. 다음은 trigger_error() 함수를 사용하여 오류를 생성하는 예제입니다.
<?php function calcDivision($dividend, $divisor) { if($divisor == 0) { trigger_error("분할자는 0이 될 수 없습니다.", E_USER_WARNING); return false; } else { return($dividend / $divisor); } } //함수 호출 echo calcDivision(10, 0); ?>
지금, 스크립트가 이 오류 메시지를 생성합니다:
경고: C:\wamp\www\project\error.php 파일의 line에서 분할자는 0이 될 수 없습니다. 4
그러나 보시다시피, 두 번째 예제에서 생성된 오류 메시지는 이전 예제보다 문제를 더 명확하게 설명합니다.