2009-11-18 15 views
18

मेरे आवेदन में मैं इसे पार्स करने के लिए url से xml लोड कर रहा हूं। लेकिन कभी-कभी यह यूआरएल मान्य नहीं हो सकता है। इस मामले में मुझे त्रुटियों को संभालने की आवश्यकता है। मैं निम्नलिखित कोड है:PHP DOMDocument त्रुटि हैंडलिंग

$xdoc = new DOMDocument(); 
try{ 
    $xdoc->load($url); // This line causes Warning: DOMDocument::load(...) 
        // [domdocument.load]: failed to open stream: 
        // HTTP request failed! HTTP/1.1 404 Not Found in ... 
} catch (Exception $e) { 
    $xdoc = null; 
} 

if($xdoc == null){ 
    // Handle 
} else { 
    // Proceed 
} 

मैं मैं जानता हूँ कि शायद गलत कर रहा है, लेकिन क्या अपवाद के इस प्रकार को संभालने के लिए एक सही तरीका है? मैं अपने पेज पर त्रुटि संदेश नहीं देखना चाहता हूं।

DOMDocument :: लोड के लिए मैनुअल() का कहना है:

कोई रिक्त स्ट्रिंग फ़ाइल नाम या एक खाली फ़ाइल के रूप में पारित हो जाता है तो नाम है, एक चेतावनी उत्पन्न हो जाएगा। यह चेतावनी libxml द्वारा उत्पन्न नहीं होती है और libxml की त्रुटि हैंडलिंग फ़ंक्शंस का उपयोग करके संभाला नहीं जा सकता है।

लेकिन इसे संभालने के तरीके पर कोई जानकारी नहीं है।

धन्यवाद।

उत्तर

32

documentation से मैं जो एकत्र कर सकता हूं उससे, इस विधि द्वारा जारी चेतावनियों को संभालना मुश्किल है क्योंकि वे libxml एक्सटेंशन द्वारा उत्पन्न नहीं होते हैं और इस प्रकार libxml_get_last_error() द्वारा प्रबंधित नहीं किया जा सकता है। आप या तो त्रुटि दमन ऑपरेटर इस्तेमाल कर सकते हैं और false के लिए वापसी मान की जाँच ...

if (@$xdoc->load($url) === false) 
    // ...handle it 

... या पंजीकृत an error handler which throws an exception on error:

function exception_error_handler($errno, $errstr, $errfile, $errline) { 
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline); 
} 

और फिर इसे पकड़।

+0

त्रुटि दमन ऑपरेटर के लिए धन्यवाद। –

+1

आप त्रुटि को दबाने के लिए libxml_use_internal_errors (false) का भी उपयोग कर सकते हैं और त्रुटियों के लिए डेटा जांच सकते हैं – Ligemer

2

php.net

से एक खाली स्ट्रिंग फ़ाइल नाम के रूप में पारित हो जाता है या एक खाली फ़ाइल का नाम है, तो एक चेतावनी उत्पन्न हो जाएगा। यह चेतावनी libxml द्वारा उत्पन्न नहीं होती है और libxml की त्रुटि हैंडलिंग फ़ंक्शंस का उपयोग करके संभाला नहीं जा सकता है।

आपके उत्पादन वातावरण में आपको उपयोगकर्ता को त्रुटियों को प्रदर्शित नहीं करना चाहिए। वे देखने के लिए उन्हें इतनी जिस खाते का उपयोग कर सकते हैं में इस लेने की जरूरत नहीं है ...

$xdoc = new DOMDocument(); 
if ($xdoc->load($url)) { 
    // valid 
} 
else { 
    // invalid 
} 
7
set_error_handler(function($number, $error){ 
    if (preg_match('/^DOMDocument::loadXML\(\): (.+)$/', $error, $m) === 1) { 
     throw new Exception($m[1]); 
    } 
}); 

$xml = new DOMDocument(); 
$xml->loadXML($xmlData); 

restore_error_handler(); 

कि पीएचपी 5.3 में मेरे लिए काम करता है। लेकिन यदि आप loadXML का उपयोग नहीं कर रहे हैं, तो आपको कुछ संशोधन करने की आवश्यकता हो सकती है।

+1

इस पोस्ट में उत्कृष्टता बहुत अधिक है! – Sebas

+0

मैं loadXML का उपयोग कर रहा हूं, लेकिन अभी भी मदद नहीं करता है ... :( –

+0

@Znarkus मुझे विश्वास है कि वर्तमान समाधान में एक छोटी सी बग है। इस कोड के दुष्प्रभाव नहीं होने के लिए, कस्टम त्रुटि हैंडलर को पॉप-अप किया जाना चाहिए स्टैक * परवाह किए बिना * क्या 'loadXML()' त्रुटियों के बिना पूरा हुआ है। वर्तमान में, यदि 'loadXML()' कस्टम त्रुटि हैंडलर द्वारा अवरुद्ध की गई त्रुटि को उत्सर्जित करता है, तो 'restore_error_handler();' कभी भी लागू नहीं किया जाएगा। कस्टम त्रुटि हैंडलर प्रभाव में रहें - जिसे हम लगभग निश्चित रूप से नहीं चाहते हैं। इसे ठीक करने के लिए, मैं अपवाद को फेंकने से ठीक पहले, 'restore_error_handler(); 'बंद करने के' if if स्टेटमेंट में कॉल जोड़ने का सुझाव दूंगा। – Nate

4

त्रुटियों फेंक अक्षम करने के लिए:

$internal_errors = libxml_use_internal_errors(true); 

$dom = new DOMDocument(); 
// etc... 

libxml_use_internal_errors($internal_errors); 
+4

मैन्युअल पढ़ें यह चेतावनी libxml द्वारा उत्पन्न नहीं होती है और libxml के त्रुटि प्रबंधन कार्यों का उपयोग करके संभाला नहीं जा सकता है। –

+1

'libxml_get_last_error()' के साथ उपयोग किए जाने पर पूरी तरह से काम करता है। – BurninLeo

0

मेरे लिए, निम्न चाल किया

$feed = new DOMDocument(); 
$res= @$feed->load('http://www.astrology.com/horoscopes/daily-extended.rss'); 
if($res==1){ 
      //do sth 
      } 
संबंधित मुद्दे