2011-12-22 2 views
4

"include"PHP 함수에서 마지막 오류를 캡처해야합니다.함수에서 오류를 캡처하는 방법은 "PHP"를 포함합니까?

"예외"기능으로 테스트하지만 불행히도 "포함"기능 위에 작성했습니다.

"include"함수 뒤에 쓰는 경우 예외가 표시되지 않습니다.

예 1

try{ 
     throw new exception(); 
     require_once($this->controller['path']); 
    } 
    catch(exception $e) 
    { 
     print_r(error_get_last()); 
    } 

이 복귀 : (보이드) ... 2

예 :

try{ 

     require_once($this->controller['path']) OR throw new exception();; 
    } 
    catch(exception $e) 
    { 
     print_r(error_get_last()); 
    } 

이 창 : 구문 분석 오류 : 구문 오류, 예기치 않은 T_THROW ...

의도적으로 포함 할 파일에 구문 오류가 발생했습니다. 아이디어는 오류를 잡아서 디버깅 할 수 있도록하는 것입니다.

누구든지이 방법을 알 수 있습니까?

얘들 아! 구문 오류를 찾아야합니다. 인사말!

+0

얘들 아! 구문 오류를 찾아야합니다. 인사말! –

+2

@OlaErlandsenTriskel : 할 수 없습니다. 구문 오류는 토큰 화 레벨에서 실패합니다. 그때까지는 코드가 실행되지 않았습니다. 파일을 포함하고 개별 파일에'token_get_all()'을 실행할 수 있습니다. 구문 분석 오류 (어쩌면 빈 배열)가 있으면 어떻게 될지 잘 모르겠습니까? – alex

+0

왜 구문 오류를 테스트하고 싶습니까? 런타임에는 실행 시간이 아니라 개발 시간에 수행해야합니다. –

답변

6

먼저 require을 사용하면 파일을 포함 할 수없는 경우 항상 앱을 종료합니다. 결과에 대한 통제권이 없으며 이후에 아무 것도 할 수 없습니다. 파일 포함의 성공을 제어하려면 include을 사용하고 반환 값을 테스트하십시오.

$success = include "foo.php"; 
if (!$success) { 
    // the file could not be included, oh noes! 
} 

당신은 그런 식의 구문 차이가 있습니다 : 파일이 당신이 잡을 수없는, 포함 할 수없는 경우

if (!(include "foo.php")) ... 

E_NOTICE을 트리거합니다. 그러나 문제가 해결되면 문제를 디버그하는 데 도움이되므로 어쨌든 오류 표시는 꺼질 것입니다 (오른쪽, 오른쪽?).

or throw new Exceptionthrow이 표현식이므로 예상 할 수 없으므로 작동하지 않습니다.


당신이 에서 구문 오류를 잡아하려면

파일, php_check_syntax /이 후계자 php -l <file>의 사용을 포함했다.

+0

다음과 같은 경우 "구문 오류"와 함께 작동하지 않습니다. S –

+0

포함 된 파일에 구문 오류가 없습니까? 이게 아마도 당신의 질문입니까? – deceze

+0

나는 의도적으로 포함 할 파일에 구문 오류를 만들었습니다. 아이디어는 오류를 잡아서 디버깅 할 수 있도록하는 것입니다. –

4

require_once은 언어 구조이며 기능이 아니므로이를 사용하여 회로를 단락 할 수 없습니다.

파일을 포함하기 전에 파일이 존재하는지 테스트하려면 is_file()을 사용할 수 있습니다. 파일을 읽을 수 있는지 테스트하려면 is_readable()을 사용할 수 있습니다.

include을 사용하면 파일을 찾을 수없는 경우 E_COMPILE_ERROR이 아닌 E_WARNING을 발행 할 수 있습니다. 내가 알렉스 동의

+0

그는 파일이 존재하는지 테스트하고 싶지 않습니다. 믿을 수 있지만 파일이 * 읽을 수있는 경우 ... * –

+0

@ Col.Shrapnel : 대답이 업데이트되었습니다. – alex

+0

권자, 그것은 다소 우스운 사람으로 바뀌었다. * read *를 포함하고 있으므로 "파일이 읽을 수 있는지 테스트하려면 is_file()을 사용할 수 있습니다. 파일을 읽을 수 있는지 테스트하려면 is_readable()을 사용할 수 있습니다." :) –

1

file_exists() 다음 예외

if(file_exists($this->controller['path'])){ 
    try{ 
     require_once($this->controller['path']); 
    }catch(Exception $e){ 
      // throw error 
    } 
} 

를 사용하거나

if(is_readable($this->controller['path'])){ 
    try{ 
     require_once($this->controller['path']); 
    }catch(Exception $e){ 
      // throw error 
    } 
} 
0

대부분의 네이티브 PHP 함수 오류보다는 던지는 예외를 트리거) (is_readable 사용 검사와 캐서린 오류로 시도 .

function exceptions_error_handler($severity, $message, $filename, $lineno) { 
    throw new ErrorException($message, 0, $severity, $filename, $lineno); 
} 
set_error_handler('exceptions_error_handler'); 

이 코드는 예외로 모든 비 치명적 오류를 잡을 수 있습니다 : 예외로 PHP 오류를 변환하려면 사용자 지정 오류 처리기를 설정할 수 있습니다. require_* 함수가 치명적인 오류를 발생 시키므로 대신 include을 사용해야합니다.

코드 자체 내에서 구문 오류를 처리하는 방법에 대해서는 약간 생각하면 매우 어렵습니다.

+0

나는 그것을 사용했지만 클래스에서 "include"함수를 호출하고있다 ... –

+2

그래서? 그것은 어디서나 작동합니다. –

관련 문제