2010-07-16 13 views
15

मुझे लगता है कि अगर विधि मैं एक PHP E_NOTICE में परिणाम का परीक्षण कर रहा हूँ विफल हो जाएगा एक परीक्षण simpleTest का उपयोग कर लिखने के लिए करना चाहते हैं।सरलतम में "अपरिभाषित अनुक्रमणिका" E_NOTICE त्रुटि को कैसे पकड़ें? ": Foo अपरिभाषित सूचकांक"

मैं सफलता के बिना expectError() और expectException() की कोशिश की। simpleTest वेबपेज संकेत मिलता है कि simpleTest समय पीएचपी त्रुटियों संकलन को पकड़ने के लिए सक्षम नहीं है, लेकिन E_NOTICE एक रन समय त्रुटि हो रहा है।

इस तरह के एक त्रुटि को पकड़ने के लिए एक रास्ता है और अपने परीक्षण असफल बनाता है यदि ऐसा है तो?

उत्तर

16

यह वास्तव में आसान है, लेकिन मैं अंत में E_NOTICE त्रुटि मैं चाहता था पकड़ने में सफल नहीं था। मैं वर्तमान error_handler ओवरराइड करने के लिए एक अपवाद है कि मैं एक try{} बयान में पकड़ेगा फेंक की जरूरत है।

function testGotUndefinedIndex() { 
    // Overriding the error handler 
    function errorHandlerCatchUndefinedIndex($errno, $errstr, $errfile, $errline) { 
     // We are only interested in one kind of error 
     if ($errstr=='Undefined index: bar') { 
      //We throw an exception that will be catched in the test 
      throw new ErrorException($errstr, 0, $errno, $errfile, $errline); 
     } 
     return false; 
    } 
    set_error_handler("errorHandlerCatchUndefinedIndex"); 

    try { 
     // triggering the error 
     $foo = array(); 
     echo $foo['bar']; 
    } catch (ErrorException $e) { 
     // Very important : restoring the previous error handler 
     restore_error_handler(); 
     // Manually asserting that the test fails 
     $this->fail(); 
     return; 
    } 

    // Very important : restoring the previous error handler 
    restore_error_handler(); 
    // Manually asserting that the test succeed 
    $this->pass(); 
} 

यह त्रुटि हैंडलर redeclare करने के लिए बस इसे पकड़ने के लिए एक अपवाद फेंक करने के लिए एक छोटे से बहुत ज्यादा जटिल लगता है। जब कोई अपवाद कैच हो गया था और कोई त्रुटि नहीं हुई, तो अन्य हार्ड पार्ट त्रुटि_handler को सही ढंग से पुनर्स्थापित कर रहा था, अन्यथा यह केवल SimpleTest त्रुटि हैंडलिंग के साथ गड़बड़ करता है।

+4

कितनी भयानक भाषा है! – m93a

+0

यदि आप set_error_handler पर दूसरे पैरामीटर के रूप में E_NOTICE प्रदान करते हैं तो यह केवल नोटिस को संभालेगा। "_error_handler_ फ़ंक्शन की ट्रिगरिंग को मास्क करने के लिए इस्तेमाल किया जा सकता है जैसे त्रुटि_ रिपोर्टिंग इन सेटिंग सेटिंग जो त्रुटियां दिखायी जाती हैं। इस मुखौटा के बिना त्रुटि_ रिपोर्टिंग सेटिंग की सेटिंग के बावजूद _error_handler_ को हर त्रुटि के लिए बुलाया जाएगा।" – nick

3

वास्तव में नोटिस त्रुटि को पकड़ने की आवश्यकता नहीं है। कोई भी 'array_key_exists' के परिणाम का परीक्षण कर सकता है और फिर वहां से आगे बढ़ सकता है। झूठे के लिए

http://www.php.net/manual/en/function.array-key-exists.php

टेस्ट और यह असफल है।

+0

यदि नीचे मतदान, कृपया बताएं क्यों। –

+2

एक ऐसा मामला है जब आप किसी सरणी को किसी अन्य सरणी में प्रक्षेपित कर रहे हैं। आप प्रत्येक व्यक्तिगत मानचित्र के लिए परीक्षण नहीं करना चाहते हैं, आप उस मामले को पकड़ना चाहते हैं जहां मैपिंग में से कोई भी विफल रहता है। अपवादों के साथ यह बहुत आसान होगा। – CMCDragonkai

0

आप इसे कोशिश पकड़ ब्लॉक के भीतर कभी नहीं पकड़ लेंगे, सौभाग्य से हम() set_error_handler है:

<?php 
function my_handle(){} 
set_error_handler("my_handle"); 
echo $foo["bar"]; 
?> 

तुम कुछ भी आप my_handle() फ़ंक्शन के अंदर चाहते हैं कर सकते हैं, या सिर्फ यह चुप्पी के लिए खाली छोड़ दें नोटिस, हालांकि, यह अनुशंसित नहीं है। एक सामान्य हैंडलर इस तरह होना चाहिए:

function myErrorHandler($errno, $errstr, $errfile, $errline) 
संबंधित मुद्दे