2011-08-20 2 views
0

왜이 오류 처리 함수를 사용하면 domdocument()가 중단됩니까?

다음

$dom = new DOMDocument(); 
$dom->loadHTML($output); 
$xpath = new DOMXPath($dom); 

으로 스크립트에 포함하고 웹 페이지를 구문 분석 할 때 (이 경우 http://www.ssense.com/women/designers/all/all/page_1, 나는 구문 분석 할 수있는 권한이 있습니다.)

AN ERROR OCCURRED IN SCRIPT '/HSPHERE/LOCAL/HOME/SITE.COM/SCRIPT.PHP' ON LINE 59: 
DOMDOCUMENT::LOADHTML(): HTMLPARSEENTITYREF: NO NAME IN ENTITY, LINE: 57 

AN ERROR OCCURRED IN SCRIPT '/HSPHERE/LOCAL/HOME/SITE.COM/SCRIPT.PHP' ON LINE 59: 
DOMDOCUMENT::LOADHTML(): TAG NAV INVALID IN ENTITY, LINE: 58 

많은 오류가 있으며 페이지로드가 완료되지 않습니다. 그러나이 오류 처리기를 포함하지 않으면

$dom->loadHTML($output); 

줄에 오류가 발생하지 않으며 몇 초 안에 예상되는 결과가 나타납니다. 오류 처리기가 loadHTML()과 관련된 경고를 catch하고 있다고 가정합니다. (

@$dom->loadHTML($output); 

를 사용하더라도 오류가보고됩니다.) loadHTML()에 대한 호출을 수용하도록 오류 처리기를 수정하거나이 문제를 해결하려면 어떻게해야합니까?

답변

2

오류의 원인이되는 것은 사용자 지정 오류 처리기가 아닙니다.

나는 사용자 지정 오류 처리기없이 다음 코드를 실행 : 나는 그것을 실행하면
$output = file_get_contents("http://www.ssense.com/women/designers/all/all/page_1"); 
$dom = new DOMDocument(); 
$dom->loadHTML($output); 
$xpath = new DOMXPath($dom); 

, 나는 당신의 오류 처리기에있는 것과 유사한 경고 메시지의 톤을 얻었다.

당신이보고있는 문제는 오류 처리기가 PHP가 기본적으로보고하지 않는 오류를보고한다는 것입니다.

기본적으로 오류보고 수준은 php.ini 설정에 의해 결정되지만 error_reporting() 기능을 사용하여 무시할 수 있습니다. 자체 오류 처리기를 설정하면 처리 할보고의 수준을 스스로 결정해야합니다. 오류 처리기는 오류 및 통지로 호출되므로 에 대한 모든 오류 메시지를으로 출력하고 현재 error_reporting() 수준에 대해 생성 된 오류를 명시 적으로 확인하지 않는 한 오류 메시지가 출력됩니다.

오류 억제 연산자 @을 사용하면 해당 행에 error_reporting(0)을 설정하는 것이 간단히 나타납니다. 예를 들어,이 줄을 다음 @ 연산자를 사용하여 사용자 정의 핸들러를 사용하는 경우 일반 PHP 오류보고가 완전히 무시되기 때문에

$errorLevel = error_reporting(0); 
$dom->loadHTML($output); 
error_reporting($errorLevel); 

현재 이후 의미가 :

@$dom->loadHTML($output); 

은 단순히 다음의 약어가 error_reporting() 레벨은 완전히 무시됩니다.사용자 지정 오류 처리기를 사용하지 않을 경우

function my_error_handler() { 
    if (error_reporting() == 0) { 
    return; // do nothing when error_reporting is disabled. 
    } 

    // normal error handling here 
} 

내 가정, PHP는 단순히 것이 디폴트이다 : 당신은 예를 들어, 현재 error_reporting() 레벨을 확인하고 그에 따라 그것을 처리하기 위해 오류 처리기에 사용자 지정 코드를 작성해야 error_reporting() 레벨이 생성되는 오류보다 낮습니다.

코드 상단에 error_reporting(E_ALL | E_STRICT);을 추가하면 사용자 지정 오류 처리기를 사용할 수없는 경우에도 이러한 오류가 표시됩니다.

3

로드중인 웹 페이지에 많은 오류가 있습니다. 예를 들어 HTML의 & 엔티티 대신 &입니다.

libxml_use_internal_errors(true); 

당신은 나중에 libxml_get_errors()로 구문 분석 오류의 목록을 얻을 수 있습니다 :

PHP DOM 그래서 모든 오류가 줄을 삽입하지 않으려면, libxml을 사용합니다.

+0

고마워, 나는이 문제를 해결하기로 결정했는데 오류 처리기가 error_reporting() (위에서 언급 한 AgentConundrum)의 값을 확인함으로써 문제를 해결하기로 결정했기 때문에 다른 곳에서도 비슷한 문제가 해결 될 수 있습니다. 궁금 해서요, 왜 libxml이 오류 제거를위한 자체 메서드를 제공합니까? 오류 처리기를 통해 처리하는 것보다 편리하기 때문입니까? – jela

관련 문제