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]; 

 // test.php는 실제 존재하지 않는 파일입니다.  
 @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'"); 
 /* 
 결과: 
 Failed opening file: error was 'file(non_existent_file) [function.file]: failed to open stream: No such 
file or directory' 
 */ 

 (@include("no file")) or die("Could not find file.php!"); // 결과: 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); 


  /* 
 결과: 
 Array 
 ( 
    [0] => 파일명: C:\Server\public_html\test.php, 소스: 7라인, 
에러코드: Undefined variable: take 
    [1] => 파일명: C:\Server\public_html\test.php, 소스: 14라인, 에러코드: Undefined variable: take
    [2] => 파일명: C:\Server\public_html\test.php, 소스: 17라인, 에러코드: Wrong par ameter count for strpos()
    [3] => 파일명: C:\Server\public_html\test.php, 소스: 20라인, 에러코드: file (non_existent_file) [function.file
]: failed to open stream: No such file or directory 
    [4] => 파일명: C:\Server\public_html\test.php, 소스: 23라인, 에러
코드: mkdir() [ function.mkdir]: File 
exists 
    [5] => 파일명: C:\Server\public_html\test.php, 소스: 26라인, 에러코드: 
file (non_existent_file) [function.file]: 
failed to open
 stream: No such file or directory 
 } 
 */ 
 ?>

0 댓글