2008-08-31 7 views
11

मैं लीप ले रहा हूं: मेरी PHP स्क्रिप्ट सभी शानदार ढंग से विफल हो जाएंगी!set_error_handler काम नहीं कर रहा है मैं इसे कैसे काम करना चाहता हूं

कम से कम, कि मैं क्या आशा करती हूं कि के लिए ...

मैं रैप करने के लिए (व्यावहारिक रूप से) कोशिश ... पकड़ बयान में हर एक लाइन नहीं करना चाहती है, तो मुझे लगता है कि मेरी सबसे अच्छी शर्त करने के लिए है मेरी फाइलों की शुरुआत के लिए कस्टम त्रुटि हैंडलर बनाएं।

मैं इसे बाहर का परीक्षण कर रहा हूँ एक अभ्यास पृष्ठ पर:

function customError($level,$message,$file,$line,$context) { 
    echo "Sorry, an error has occured on line $line.<br />"; 
    echo "The function that caused the error says $message.<br />"; 
    die(); 
} 

set_error_handler("customError"); 

echo($imAFakeVariable); 

यह काम करता है ठीक, लौटने:

Sorry, an error has occured on line 17. The function that caused the error says Undefined variable: imAFakeVariable.

हालांकि, इस स्थापना अपरिभाषित कार्यों के लिए काम नहीं करता।

function customError($level,$message,$file,$line,$context) { 
    echo "Sorry, an error has occured on line $line.<br />"; 
    echo "The function that caused the error says $message.<br />"; 
    die(); 
} 

set_error_handler("customError"); 

imAFakeFunction(); 

यह रिटर्न:

Fatal error: Call to undefined function: imafakefunction() in /Library/WebServer/Documents/experimental/errorhandle.php on line 17

क्यों अपने कस्टम त्रुटि हैंडलर अपरिभाषित कार्यों को पकड़ने नहीं है? क्या ऐसी कोई अन्य समस्याएं हैं जिनसे इसका कारण होगा?

उत्तर

9

set_error_handler के कोड के साथ त्रुटियों को संभालने के लिए बनाया गया है। ऐसा इसलिए है क्योंकि set_error_handlerउपयोगकर्ता त्रुटि फ़ंक्शन trigger_error द्वारा फेंकने वाली त्रुटियों की रिपोर्ट करने का एक तरीका है।

हालांकि, मैं मैनुअल में इस टिप्पणी है कि आप मदद कर सकते हैं मिला:

"The following error types cannot be handled with a user defined function: E_ERROR , E_PARSE , E_CORE_ERROR , E_CORE_WARNING , E_COMPILE_ERROR , E_COMPILE_WARNING , and most of E_STRICT raised in the file where set_error_handler() is called."

This is not exactly true. set_error_handler() can't handle them, but ob_start() can handle at least E_ERROR .

<?php 

function error_handler($output) 
{ 
    $error = error_get_last(); 
    $output = ""; 
    foreach ($error as $info => $string) 
     $output .= "{$info}: {$string}\n"; 
    return $output; 
} 

ob_start('error_handler'); 

will_this_undefined_function_raise_an_error(); 

?> 

सच हालांकि इन त्रुटियों को चुपचाप एक फ़ाइल में सूचित किया जाना चाहिए उदाहरण के लिए,। उम्मीद है कि आपकी परियोजना में E_PARSE त्रुटियां नहीं होंगी! :-)

सामान्य त्रुटि रिपोर्टिंग के लिए, अपवादों के साथ चिपकें (मुझे उन्हें अपने एमवीसी सिस्टम के साथ जोड़ने में मदद मिलती है)। आप बटन के माध्यम से विकल्प प्रदान करने के लिए एक सुंदर बहुमुखी अपवाद बना सकते हैं और उपयोगकर्ता को यह जानने के लिए बहुत कुछ विवरण जोड़ सकते हैं कि क्या गलत है।

1

Why isn't my custom error handler catching undefinedd functions? Are there other problems that this will cause?

अनुमान में, मैं कहूंगा कि अपरिभाषित फ़ंक्शन त्रुटियां अन्य त्रुटि प्रकारों की तुलना में एक अलग निष्पादन पथ से यात्रा करती हैं। शायद PHP डिजाइनर आपको और बता सकते हैं, सिवाय इसके कि मुझे संदेह है कि PHP किसी भी तरह से डिज़ाइन किया गया है।

यदि आप चाहते हैं कि आपकी स्क्रिप्ट्स अभी भी PHP-शैली लिखते समय कृपापूर्वक असफल हो जाएं, तो पूरे पृष्ठ को फ़ंक्शन में डालने का प्रयास करें और फिर इसे try..catch ब्लॉक में कॉल करें।

1

documentation से (जोर जोड़ा):

The following error types cannot be handled with a user defined function: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING, and most of E_STRICT raised in the file where set_error_handler() is called.

अपरिभाषित कार्यों कॉलिंग एक E_ERROR से चलाता है, इस प्रकार यह त्रुटि कॉलबैक द्वारा नियंत्रित नहीं किया जा सकता है (या उस बात के लिए अपवाद संचालकों द्वारा)। आप जो कुछ भी कर सकते हैं वह है त्रुटि 0 रिपोर्टिंग 0

पीएस, यदि आप अपना खुद का त्रुटि हैंडलर रोल कर रहे हैं, तो आपको सही ढंग से @ ऑपरेटर को संभालने की देखभाल करनी चाहिए। प्रलेखन से (जोर जोड़ा): E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE:

It is important to remember that the standard PHP error handler is completely bypassed. error_reporting() settings will have no effect and your error handler will be called regardless - however you are still able to read the current value of error_reporting and act appropriately. Of particular note is that this value will be 0 if the statement that caused the error was prepended by the @ error-control operator.

6

मुझे लगता है कि आप register_shutdown_function भी

उपयोग करने के लिए उदाहरण के लिए की जरूरत है:

register_shutdown_function(array($this, 'customError'));. 

    function customError() 
    { 

    $arrStrErrorInfo = error_get_last(); 

    print_r($arrStrErrorInfo); 

    } 
0

बहुत दिलचस्प बात यह है कि मैं आज की खोज की है के रूप में मैं इसी तरह की समस्या का सामना करना पड़ रहा था। आप निम्न का उपयोग करते हैं - यह अपने कस्टम त्रुटि हैंडलर समारोह/विधि के साथ त्रुटि को पकड़ लेगा:

ini_set('display_errors', 'Off'); 
error_reporting(-1); 

set_error_handler(array("Cmd\Exception\Handler", "getError"), -1 & ~E_NOTICE & ~E_USER_NOTICE); 

करने के लिए 'display_errors' की स्थापना करके 'बंद करें' आप अभी भी पकड़ कर सकते हैं उन्हें हैंडलर के साथ पकड़ने।

0

मैं कुछ समय के लिए त्रुटि प्रबंधन के साथ खेल रहा हूं और ऐसा लगता है कि यह अधिकांश भाग के लिए काम करता है।

function fatalHandler() { 
    global $fatalHandlerError, $fatalHandlerTitle; 

    $fatalHandlerError = error_get_last(); 

    if($fatalHandlerError !== null) { 

     print($fatalHandlerTitle="{$fatalHandlerTitle} | ".join(" | ", $fatalHandlerError). 
       (preg_match("/memory/i", $fatalHandlerError["message"]) ? " | Mem: limit ".ini_get('memory_limit')."/peak ".round(memory_get_peak_usage(true)/(1024*1024))."M" : "")."\n". 
         "GET: ".var_export($_GET,1)."\n". 
         "POST: ".var_export($_POST,1)."\n". 
         "SESSION: ".var_export($_SESSION,1)."\n". 
         "HEADERS: ".var_export(getallheaders(),1)); 
    } 

    return $fatalHandlerTitle; 
} 

function fatalHandlerInit($title="phpError") { 
    global $fatalHandlerError, $fatalHandlerTitle; 

    $fatalHandlerTitle = $title; 
    $fatalHandlerError = error_get_last(); 

    set_error_handler("fatalHandler"); 
} 

अब मुझे एक समस्या है जहां स्मृति समाप्त हो गई है, यह हर बार इसकी रिपोर्ट नहीं करता है। ऐसा लगता है कि यह इस बात पर निर्भर करता है कि कितनी मेमोरी का उपयोग किया जा रहा है। मैंने अनंत लूप में एक बड़ी फ़ाइल लोड करने के लिए एक स्क्रिप्ट की है (स्मृति का ~ 6.6 एम लेता है)। Setup1:

ini_set('memory_limit', '296M'); 

fatalHandlerInit("testing"); 

$file[] = file("large file"); // copy paste a bunch of times 

इस मामले में मैं त्रुटि मिलती है रिपोर्ट होने के लिए और यह 45 फ़ाइल लोड पर मर जाता है।

सेटअप 2 - वही लेकिन बदलें: ini_set ('memory_limit', '29 9M');

इस बार मुझे कोई त्रुटि नहीं मिली है और यह मेरे कस्टम त्रुटि फ़ंक्शन को भी कॉल नहीं करता है। लिपि एक ही पंक्ति पर मर जाती है।

क्या किसी के पास कोई सुराग है कि उसके आस-पास क्यों और कैसे जाना है?

संबंधित मुद्दे