PHP 에서 오류를 제어할 수 있는 몇 가지 방법을 제공합니다.
오류 보고 수준
error_reporting() 함수를 이용해 오류를 보여줄 수준을 제어할 수 있습니다. 아래 표를 참고해서 오류 보고 수준을 설정하세요.
error_reporting(E_ERROR | E_WARNING);
속 성 | 설 명 |
---|
E_ALL | 모든 에러 메시지 |
---|
E_ERROR | 치명적인 실행오류 |
---|
E_RECOVERABLE_ERROR | 더욱 치명적인 실행오류 |
---|
E_WARNING | 심각하지 않은 실행오류 |
---|
E_PARSE | 컴파일 시의 구문오류 |
---|
E_NOTICE | 일반적인 코드, 변수 문제에 의한 오류 |
---|
E_CORE_ERROR | 젠드엔진의 심각한 오류 |
---|
E_CORE_WARNING | 젠드엔진의 심각하지 않은 오류 |
---|
E_COMPILE_ERROR | 젠드엔진의 심각한 컴파일오류 |
---|
E_COMPILE_WARNING | 젠드엔진의 심각하지 않은 컴파일오류 |
---|
E_USER_ERROR | 사용자가 만든 오류 메시지 |
---|
E_USER_WARNING | 사용자가 만든 경고 메시지 |
---|
E_USER_NOTICE | 사용자가 만든 통보 메시지 |
---|
E_DEPRECATED | 향후 버전에는 작동하지 않는다는 경고 메시지 |
---|
E_USER_DEPRECATED | 사용자가 만든 배제된 경고 |
---|
골뱅이(@) 제어
골뱅이는 php 코드 앞에 오면 모든 오류 메시지를 무시할 수 있습니다.
골뱅이는 변수, 함수, include()호출, 상수에 사용할 수 있지만, if 나 foreach 와 같은 조건부 제어문에는 사용할 수 없습니다.
다음 예는 분명 코드가 잘못되어 있지만 오류를 표시하지 않습니다.
<?php
@mkdir('폴더경로');
@file('test file');
$str = @$var[$key];
@include('test.php');
$var = @new some_class();
?>
함수로 인해 발생한 오류를 골뱅이로 제어하면 어느 위치에서 오류가 발생하였는지 알 수 없게 됩니다. 그러니 테스트할 때는 오류를 볼 수 있게 하고 실제 운영할 때는 사용자 오류 메시지를 만들거나 숨길 필요가 있습니다.
<?php
(@include('test.php')) or die(" 실제 존재하지 않는 파일입니다.");
$my_file = @file ('non_existent_file') or die ("파일을 오픈할 수 없습니다.");
@mkdir() or die('폴더 경로를 지정하지 않았습니다.');
if( @$var === $something ){ }
if( @$_SERVER[ 'HTTP_REFERER' ] !== '/www/some/path/file' ) { }
if( @$_POST[ 'checkbox' ] === 'yes' ) { }
?>
$php_errormsg 변수
일단 오류가 발생하면 $php_errormsg 이라는 변수에 오류 내용이 저장됩니다. 이 변수는 새로운 오류가 나올 때 마다 덮여 지므로, 배열로 만들거나 즉시 보여줘야 합니다.
<?php
$my_file = @file ('non_existent_file') or
die ("Failed opening file: error was '$php_errormsg'");
(@include("no file")) or die("Could not find file.php!");
?>
$php_errormsg 변수를 사용하려면 php.ini 의 track_errors 를 On 했을 때만 동작합니다. 다음은 모든 에러 메시지를 배열로 저장한 예제입니다.
<?php
$errormsg = array();
$value = @$take;
$errormsg[] = "파일명: ".__FILE__.", 소스: ".__LINE__."라인, 에러코드: ".$php_errormsg."\n";
function test(){
mkdir();
}
@test();
$errormsg[] = "파일명: ".__FILE__.", 소스: ".__LINE__."라인, 에러코드: ".$php_errormsg."\n";
@strpos();
$errormsg[] = "파일명: ".__FILE__.", 소스: ".__LINE__."라인, 에러코드: ".$php_errormsg."\n";
@file ('non_existent_file');
$errormsg[] = "파일명: ".__FILE__.", 소스: ".__LINE__."라인, 에러코드: ".$php_errormsg."\n";
@mkdir('폴더경로');
$errormsg[] = "파일명: ".__FILE__.", 소스: ".__LINE__."라인, 에러코드: ".$php_errormsg."\n";
$my_file = @file ('non_existent_file');
$errormsg[] = "파일명: ".__FILE__.", 소스: ".__LINE__."라인, 에러코드: ".$php_errormsg."\n";
print_r($errormsg);
?>