2011-12-14 22 views
7

odbc_errormsg odbc_execute से त्रुटि संदेश की रिपोर्ट नहीं करता है जिस तरह से यह माना जाता है। यह केवल एक चेतावनी फेंकता है। तो मुझे error_get_last के माध्यम से त्रुटि संदेश को पार्स करने के लिए एक हैक लिखने के लिए मजबूर किया गया है।error_get_last() और कस्टम त्रुटि हैंडलर

मैं set_error_handler और error_get_last रिटर्न NULL उपयोग कर रहा हूँ जब तक कि मैं या तो:

  1. मेरी त्रुटि हैंडलर अक्षम करें,

  2. या इसे वापस FALSE बनाते हैं।

मुझे लगता है कि हम इस PHP के अंतर्निहित त्रुटि हैंडलर त्रुटि विवरण कहीं संग्रहीत करें ताकि वे बाद में पुनः प्राप्त किया जा सकता है की देखभाल करने के कारण है।

क्या मेरे कस्टम त्रुटि हैंडलर में ऐसे व्यवहार का अनुकरण करने का कोई तरीका है इसलिए error_get_last() सामान्य रूप से उपयोग किया जा सकता है?

कृपया ध्यान दें कि मुझे किसी भी समय त्रुटि जानकारी पुनर्प्राप्त करने के कई तरीके पहले से ही जानते हैं। मेरा सवाल यह है कि error_get_last उपयोग करने योग्य कैसे करें।


अद्यतन: मुझे लगता है कि मैं बेहतर कुछ कोड पोस्ट चाहते हैं।

पीएचपी error_get_last() है, जो यह करने के लिए अनुमति देता है:

@fopen('xxx'); 
var_dump(error_get_last()); 

... और मिल इस:

array(4) { 
    ["type"]=> 
    int(2) 
    ["message"]=> 
    string(46) "fopen() expects at least 2 parameters, 1 given" 
    ["file"]=> 
    string(69) "C:\Documents and Settings\ALVARO.GONZALEZ\Mis documentos\tmp\test.php" 
    ["line"]=> 
    int(3) 
} 

यह टूट जाता है, तो आप अंतर्निहित त्रुटि हैंडलर की जगह:

function custom_error_handler($errno, $errstr, $errfile, $errline){ 
    $ignore = ($errno & error_reporting()) == 0; 
    if(!$ignore){ 
     echo "[Error happened: $errstr]\n"; 
    } 
    return TRUE; 
} 
set_error_handler('custom_error_handler'); 

@fopen('xxx'); 
var_dump(error_get_last()); // NULL 

यदि आप दोनों त्रुटि हैंडलर रखते हैं ...

function custom_error_handler($errno, $errstr, $errfile, $errline){ 
    $ignore = ($errno & error_reporting()) == 0; 
    if(!$ignore){ 
     echo "[Error happened: $errstr]\n"; 
    } 
    return FALSE; 
} 
set_error_handler('custom_error_handler'); 

error_reporting(E_ALL); 
echo $foo; 

... आप साइड इफेक्ट मिलता है:

[Error happened: Undefined variable: foo] 

Notice: Undefined variable: foo in C:\Documents and Settings\ALVARO.GONZALEZ\Mis documentos\tmp\test.php on line 15 

Call Stack: 
    0.0004  329720 1. {main}() C:\Documents and Settings\ALVARO.GONZALEZ\Mis documentos\tmp\test.php:0 

... बस के बजाय:

[Error happened: Undefined variable: foo] 

मैं error_get_last के साथ ठीक से इंटरफेस करने अपने कस्टम त्रुटि हैंडलर करना चाहते हैं। मुझे ठीक काम करने के लिए error_get_last चाहिए।

+0

क्या आप एक अलग (उपयोगकर्ता परिभाषित) फ़ंक्शन का उपयोग स्वीकार करेंगे? क्योंकि अगर आप, आप केवल पिछले त्रुटि एक वैश्विक वर में स्टोर सकता है, और एक समारोह है कि बस है '$ वैश्विक [ 'VARNAME'] वापसी है,' – DaveRandom

+0

लौटने है 'स्वीकार्य नहीं FALSE'? यदि हां, तो क्यों? – Jon

+0

इसके अलावा, आप [ '$ php_errormsg'] के लिए एक मूल्य बताए की कोशिश की है (http://uk.php.net/manual/en/reserved.variables.phperrormsg.php)? मुझे कोई जानकारी नहीं है कि यह कुछ भी हासिल करेगा (या यहां तक ​​कि प्रभावित करेगा), लेकिन यह कोशिश करने लायक हो सकता है ... – DaveRandom

उत्तर

5

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

function my_error_handler ($errno, $errstr, $errfile = '', $errline = 0, $errcontext = array()) { 

    // Handle the error here 

    @trigger_error($errstr); 
    return TRUE; 

} 

// Just to make sure PHP is not outputting anything 
error_reporting(-1); 
ini_set('display_errors',1); 

set_error_handler('my_error_handler'); 

// An E_USR error... 
trigger_error('Some error'); 
var_dump(error_get_last()); 

// ...and a native one 
$key = count(); 
var_dump(error_get_last()); 

परिणाम::

चारों ओर खेलने का एक सा के बाद, मैं यह है कि पता चला है

array(4) { 
    ["type"]=> 
    int(1024) 
    ["message"]=> 
    string(10) "Some error" 
    ["file"]=> 
    string(69) "C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\test.php" 
    ["line"]=> 
    int(7) 
} 
array(4) { 
    ["type"]=> 
    int(1024) 
    ["message"]=> 
    string(45) "count() expects at least 1 parameter, 0 given" 
    ["file"]=> 
    string(69) "C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\test.php" 
    ["line"]=> 
    int(7) 
} 

अपने त्रुटि हैंडलर के भीतर से @trigger_error() कॉलिंग, और FALSE वापस नहीं, का कारण बनता है error_get_last()NULL के अलावा कुछ और वापस करने के लिए, लेकिन क्योंकि त्रुटि @ के साथ दबा दी गई है, PHP कुछ भी आउटपुट नहीं करता है। ऐसा लगता है कि एक अनंत प्रत्यावर्तन से परहेज, पंजीकृत त्रुटि हैंडलर समारोह के भीतर से trigger_error() बुला त्रुटि हैंडलर फोन नहीं करता है के हित में - जो यहाँ अपने लाभ के लिए काम करता है।

जाहिर है, त्रुटि कोड संशोधित किया गया है, लेकिन यदि आपको आवश्यकता हो तो इसे प्रासंगिक E_USR_* कोड में परिवर्तित कर सकते हैं - लेकिन मुझे संदेह है कि आप वास्तव में क्या चाहते हैं स्ट्रिंग मान है, जो यह विधि आपको प्राप्त करने की अनुमति देगी। दुर्भाग्यवश, आपने लाइन नंबर और फ़ाइल जानकारी भी खो दी है - यद्यपि आप संभवतः त्रुटि हैंडलर के अंदर एक स्टैक ट्रेस को शामिल करके, या कम से कम तर्कों से स्ट्रिंग में इसे शामिल करके कुछ हासिल कर सकते हैं।

यह एक भयानक, भयानक, भयानक हैक है - लेकिन कोई ऐसा करने के लिए आधिकारिक तौर पर स्वीकृत तरीका है के बाद से, एक हैक अनिवार्य है कि आप क्या कह रहे हैं।

+0

विटी ... मैं इसे ध्यान से अध्ययन करने की जरूरत :) के रूप में http –

+0

@ ÁlvaroG.Vicario, मजाकिया रूप में: //ioccc.org ..... – Pacerier

0

आप अपने कस्टम त्रुटि हैंडलर झूठी वापस जाने के लिए बदल सकता है, बस जब त्रुटि नजरअंदाज कर दिया है (@ -operator प्रयुक्त)।

function custom_error_handler($errno, $errstr, $errfile, $errline){ 
    $ignore = ($errno & error_reporting()) == 0; 
    if ($ignore) { 
     return FALSE; 
    } 
    echo "[Error happened: $errstr]\n"; 
    return TRUE; 
} 
संबंधित मुद्दे