2010-05-25 3 views
7

डिफ़ॉल्ट Xdebug तक की डंपिंग किसी भी अपवाद डंप हो जाएगा यह पकड़ा गया है या नहीं की परवाह किए बिना या नहीं:अक्षम Xdebug के पकड़ा अपवाद

try { 
    throw new Exception(); 
} 
catch (Exception $e) { 
} 
echo 'life goes on'; 

XDebug सक्षम होने और डिफ़ॉल्ट सेटिंग्स कोड के इस टुकड़े वास्तव में उत्पादन होगा कुछ निम्नलिखित की तरह (अच्छी तरह से स्वरूपित):

(!) Exception: in /test.php on line 3 Call Stack 
# Time Memory Function Location 1 0.0003 52596 {main}() ../test.php:0 
life goes on 

क्या इस व्यवहार को अक्षम करना संभव है और इसे केवल अपूर्ण अपवादों को डंप करना संभव है?

अग्रिम धन्यवाद।

अद्यतन: मैं के बारे में यह निष्कर्ष निकला कि यह एक बग है हूँ, उम्मीद के रूप में (उबंटू 9.10 पर पीएचपी 5.2.10 साथ Xdebug v2.0.5 का उपयोग कर के बाद से xdebug.show_exception_trace डिफ़ॉल्ट रूप से अक्षम है फिर भी यह व्यवहार न करे)।

उत्तर

9

xdebug.show_exception_trace विकल्प बदलें (ध्यान दें कि यह डिफ़ॉल्ट रूप से सक्षम नहीं है)।

xdebug.show_exception_trace

प्रकार: पूर्णांक, डिफ़ॉल्ट मूल्य: 0

इस सेटिंग को 1 पर सेट किया जाता है, Xdebug एक स्टैक ट्रेस जब भी एक अपवाद उठाया है दिखाएगा - यह अपवाद नहीं है, भले ही वास्तव में पकड़ा।

+0

मैं मानता हूं कि इसका xdebug.show_exception_trace के साथ कुछ करना है। मुझे लगता है कि 0 पर सेट होने पर इसे अपवाद अपवादों को अनदेखा करना चाहिए, लेकिन किसी भी तरह से यह स्पष्ट रूप से अक्षम होने पर भी काम नहीं करता है। – nuqqsa

+0

# php.pecl @ EFNet पर डरिक से बात करें या http://bugs.xdebug.org/ – Artefacto

+0

पर बग ट्रैकर का उपयोग करें यह अंतिम टिप्पणी आपके उत्तर को पूरा करती है :) मैं निश्चित रूप से इस बग की रिपोर्ट करने जा रहा हूं यदि मैं कर सकता हूं अभी भी इसे 2.1.0 आरसीएक्स में पुन: उत्पन्न करें। धन्यवाद। – nuqqsa

1

अपने कोड namespaced है, तो कैच ब्लॉक \Exception का उल्लेख होना चाहिए - बैकस्लैश साथ - कोई बैकस्लैश है तो पीएचपी अपने वर्तमान नाम स्थान में Exception के लिए दिखेगा। यह आमतौर पर विफल रहता है और बिना अपवाद अपवाद Xdebug को पारित किया जाता है।

निम्नलिखित कोड Xdebug करने के लिए अपवाद गुजरता है:

namespace foo; 

try { 
    new \PDO(0); 
} catch (\Exception $e) { 
    echo "Caught!"; 
} 
// Exception caught correctly 

मैन्युअल फेंक अपवाद हो सकते हैं:

namespace foo; 

try { 
    new \PDO(0); 
} catch (Exception $e) { 
    echo "Caught!"; 
} 
// Fatal error: Uncaught exception... 

एक बैकस्लैश जोड़ना अपवाद ग्लोबल नेम स्पेस में की खोजेगा (और पाते हैं) Exception से पहले भ्रमित (यही कारण है कि मैंने उपरोक्त पीडीओ का उपयोग किया)। हम वर्तमान नाम स्थान से एक अपवाद फेंक करने का प्रयास करें, पीएचपी हमें अपवाद बताता है वहाँ मौजूद नहीं है:

namespace foo; 

try { 
    throw new Exception(); 
} catch (Exception $e) { 
    echo "Caught!"; 
} 
// Fatal error: Class 'foo\Exception' not found 

कैच ब्लॉक में एक वैश्विक संदर्भ के बिना एक वैश्विक अपवाद फेंकने अलग तरह से विफल रहता है:

namespace foo; 

try { 
    throw new \Exception(); // global Exception 
} catch (Exception $e) { 
    echo "Caught!"; 
} 
// Fatal error: Uncaught exception 'Exception' in... 

इन सबके प्रकाश में, शायद बैकस्लैश के साथ कैच के Exception को उपसर्ग करना हमेशा अच्छा विचार है।

namespace foo; 

try { 
    throw new \Exception(); 
} catch (\Exception $e) { 
    echo "Caught!"; 
} 
// Exception caught correctly