2010-01-15 2 views
11

나는 방금 재교육 한 PHP 응용 프로그램을 가지고 있습니다.경고를 오류로 처리하기

경고 : 같은 불행하게도 그것은 밖으로 분출 경고는 preg_match()는 매개 변수 2 선 776

에 /home/yacoby/dev/netbeans/php/Zend/Db/Select.php에 주어진 문자열, 객체가 될 것으로 예상

콜 스택이 없으므로 문제를 해결하는 것이 불가능하므로 코드의 어느 부분에서 경고가 발생하고 코드가 많은지 알 수 없습니다.

오류와 같은 경고를 처리하는 방법이 필요합니다 (응용 프로그램이 중지되어 스택 트레이스를 인쇄한다는 점에서) 또는 오류를 인쇄 할 때 스택 트레이스를 표시해야합니다. 이 작업을 수행 할 수있는 방법이 있습니까?

+2

Xdebug이 최선의 선택입니다. – andyk

+0

XDebug 응답은 최고의 스택 추적을 생성 했으므로 허용되었습니다 (플러스 IDE에 클릭 가능한 링크가 있음).) 다른 모든 사람들도 좋은 답변을 얻기 위해서 +1을 얻었습니다. – Yacoby

+1

XDebug에서 이와 같은 기능에 대해 설명합니다. http://xdebug.org/docs/stack_trace – naivists

답변

4

당신은 그러나 당신이 원하는 오류의 각 클래스를 처리 할 수있는 핸들러 함수에서 set_error_handler()

를 사용하여 자신의 오류 처리기를 정의 할 수 있습니다. 필자가 사용하는 기본 템플릿은 치명적인 오류 만 처리하기 때문에 알림과 경고는 무시합니다. 귀하의 경우에는

당신은 경고에 역 추적을 수행 또는 그러나 당신이

function error_handler($errno,$message,$file,$line,$context) { 

switch($errno) { 
    // ignore warnings and notices 
    case E_WARNING: 
    case E_NOTICE: 
    case E_USER_NOTICE: 
    case E_USER_WARNING: 
     break; 
    // log PHP and user errors 
    case E_ERROR: 
    case E_USER_ERROR: 
       // Do some processing on fatal errors 
    } 
} 
+1

다음 오류 유형은 사용자 정의 함수로 처리 할 수 ​​없습니다. ** E_ERROR **, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING 및 대부분의 E_STRICT는 set_error_handler()가 호출 된 파일에서 발생합니다. 그럼에도 불구하고 나는지지를 표했다. – Gordon

+0

아, 정보 주셔서 감사합니다. 나는 일반적으로 USER_ERROR를 처리하는데 이것을 사용했지만, E_ERROR를 잡을 수 없다는 것을 인식하지 못했다. –

18

http://www.php.net/manual/en/class.errorexception.php

<?php 
function exception_error_handler($errno, $errstr, $errfile, $errline) { 
    throw new ErrorException($errstr, $errno, 0, $errfile, $errline); 
} 
set_error_handler("exception_error_handler"); 

/* Trigger exception */ 
strpos(); 
?> 
+0

그건 아주 멋지다. 나는 그런 식으로 생각하지 않았다. –

+0

이것이 PHPUnit이 PHPUnit Framework 오류/통지/경고 예외에 대한 일반적인 오류,주의 사항 및 경고를 전환하는 방법이라고 생각합니다. – Gordon

+0

"멋진"기능인지는 모르겠지만 가장 쉽습니다. :피 –

9

에서 예 # 1을 참조 할 set_error_handler()에서 살펴보고에서이 포함 그들을 로그온 할 수 스크립트의 시작 또는 부트 스트랩에서 E_WARNING이 발생할 때 스택 추적을 인쇄하십시오.

function stacktrace_error_handler($errno,$message,$file,$line,$context) 
{ 
    if($errno === E_WARNING) { 
     debug_print_backtrace(); 
    } 
    return false; // to execute the regular error handler 
} 
set_error_handler("stacktrace_error_handler"); 

다양한 유형을 더 잘 제어하려면 답변의 다른 곳에 게시 된 더 명확한 버전을 살펴보십시오.

관련 문제