2012-02-29 22 views
5

मैंने जिस परियोजना पर काम कर रहा हूं उसके साथ मैंने खुद को एक छेद में खोला है। मुझे यह विशाल परियोजना मिली है (हजारों लाइनों में से 100), और हर जगह MySQL त्रुटियां हैं। मैं अब उन्हें साफ करने की प्रक्रिया में हूं।निष्पादन को रोकने के बिना अपवाद फेंक दें?

मुझे यह डेटाबेस क्लास मिला है जो सभी प्रश्नों के माध्यम से गुजरता है, इसलिए जब भी कोई SQL त्रुटि होती है, तो मैंने अपवाद फेंक दिया है। समस्या यह है कि मेरे पास निष्पादन रोक नहीं है। इसे हमेशा जारी रखना होगा, और बस अपवाद लॉग इन करें ताकि मैं उन्हें ट्रैक कर सकूं और उन्हें एक समय में ठीक कर सकूं।

मुझे उम्मीद थी कि set_exception_handler मैं जो चाहता हूं वह करूंगा, लेकिन दस्तावेज़ विशेष रूप से कहते हैं कि यह मेरे हैंडलर को कॉल करने के बाद निष्पादन को रोक देगा। तो मैं इस के आसपास कैसे हो सकता है?

अपवाद वर्तमान फ़ंक्शन को रोक सकता है, लेकिन फिर मैं इसे फ़ंक्शन से बाहर निकलना चाहता हूं, शायद शून्य या झूठी लौट रहा हूं, और फिर सामान्य के रूप में जारी रहता हूं, लेकिन मुझे इसे अपने वैश्विक अपवाद हैंडलर को कॉल करने की आवश्यकता है।


स्पष्ट करने के लिए:

मैं एक अपवाद (जब भी वहाँ एक एसक्यूएल त्रुटि है) मेरी डेटाबेस वर्ग से फेंक करना चाहते हैं। मैं तब इस त्रुटि को लॉग करना चाहता हूं और/या स्क्रीन पर एक संदेश प्रदर्शित करना चाहता हूं जब तक कि मैं या तो SQL त्रुटि को ठीक नहीं कर सकता, या कोशिश/पकड़ में अपमानजनक रेखा को लपेटूं। मैं नहीं चाहता कि यह निष्पादन रोकें। अगर मैं अपवाद फेंकने के बजाय बस कुछ error_handler() फ़ंक्शन को कॉल करता हूं, तो मैं इसे पकड़ नहीं सकता। अगर मैं इसे तुरंत पकड़ता हूं (डीबी कक्षा के भीतर भी), तो मैं इसे ढेर से आगे नहीं पकड़ सकता (जब तक कि मैं इसे फिर से फेंक नहीं देता, लेकिन फिर हम निष्पादन को रोकने के लिए वापस आ जाते हैं)।

+0

आप पहले से ही कर दिया है तो

और फिर है कि एक ही अपवाद संचालक अभी भी सभी अन्य अपवाद है कि वास्तव में फेंक दिया जाता है को पकड़ने के लिए इस्तेमाल किया जा सकता अपवादों में MySQL त्रुटियों का अनुवाद करने के लिए कोड को अपडेट किया गया है क्यों अपवाद फेंकने के बजाय त्रुटि को लॉग न करें? – pgraham

+0

@pg ग्राहम: इसे हटाएं ... यह एक अच्छा सवाल है। इसका कारण यह है कि अगर मैं वैश्विक अपवाद हैंडलर में नहीं आना चाहता था तो मैं अपवाद को पकड़ने में सक्षम होना चाहता था। इसके अलावा, मैं एक केंद्रीकृत अपवाद हैंडलिंग और लॉगिंग फ़ंक्शन चाहता हूं। आखिरकार, जब मैं त्रुटियों को साफ़ करता हूं, तो मैं वैश्विक अपवाद हैंडलर को थोड़ा संशोधित करना चाहता हूं ताकि वास्तव में * मर जाए और घातक त्रुटि डालें। – mpen

+1

@downvoter: यह समझाने की देखभाल क्यों यह एक बुरा सवाल है? – mpen

उत्तर

0

मुझे लगता है कि मुझे एक कामकाज मिला है। फेंकने एक अपवाद के बजाय, मैं अपवाद के साथ सीधे मेरी हैंडलर कॉल कर सकते हैं:

global_exception_handler(new MySqlException($error_message)); 

इस तरह मेरी हैंडलर अभी भी बुलाया जाता है, लेकिन निष्पादन जारी है।

function _global_exception_handler($e) { 
    // log error here 
} 

set_exception_handler('global_exception_handler'); 
+0

यह एक * वर्कअराउंड * नहीं है। – Alexander

+0

यह एक डीबग प्रिंटिंग जोड़ने की तरह है, नहीं? – alfasin

1

अगर मैं तुम्हें सही ढंग से समझ लिया है:

function myFunction($params) { 

    try { 

     //your code which throws Exception 

    } catch (Exception $e) { 

     myErrorFunction($e); 
     return false; 
    } 

} 
+0

नहीं, मुझे नहीं लगता कि आप मेरी पूरी आवश्यकताओं को समझते हैं। मैं कोशिश/पकड़ कहाँ रखूँगा? मेरे पास अभी भी प्रत्येक SQL क्वेरी के आस-पास रखने के लिए समय नहीं है, इसलिए मुझे इसे बिल्कुल ठीक रखना होगा जहां मैं इसे फेंक दूंगा ... लेकिन फिर मैं इसे और नीचे नहीं पकड़ सकता क्योंकि मैंने इसे पहले ही पकड़ा है । मुझे नहीं लगता कि मैं क्या करना चाहता हूं। – mpen

+0

आप या तो संपूर्ण कोड लपेट सकते हैं या बस इसे अपने डेटाबेस वर्ग में उपयोग कर सकते हैं। आपके पास कितने तरीके हैं? 10? 20? बस उन्हें पकड़ने की कोशिश करें और हर बार जब आप इसे निष्पादित करते हैं, उदाहरण के लिए '$ db-> myCustonQuery() ', आप जानते हैं कि यदि कोई त्रुटि होती है तो यह एक अपवाद फेंक देगा जिसे आप कहीं और संभाल सकते हैं। इस उत्तर का वास्तविक बिंदु यह है कि यदि आप 'झूठी वापसी' करते हैं तो आप अपना निष्पादन जारी रखने में सक्षम होंगे। – Shoe

+0

यदि मैं पूरा कोड लपेटता हूं, तो जब कोई अपवाद फेंक दिया जाता है, तो निष्पादन उस बिंदु (पकड़) पर गिर जाएगा; मुझे इसे बहुत ज्यादा जारी रखने की ज़रूरत है जहां इसे छोड़ दिया गया था (फेंक पर)। कितने तरीकों से? क्या, मेरी डीबी कक्षा में? 10-20 एक उचित अनुमान है, लेकिन उनको लपेटने से मुझे पकड़ने की अनुमति नहीं मिलती है, जहां मैं चाहता हूं। असल में मैं * सक्षम होना चाहता हूं * जहां मैं '$ db-> GetSingleRecord()' कहता हूं, लेकिन वैकल्पिक रूप से, क्योंकि हजारों कॉल कहने वाले कार्यों के लिए हैं और मुझे उन सभी के माध्यम से जाना है। क्या इसका कोई मतलब है? मुझे लगता है कि मैं जो पूछ रहा हूं वह अवास्तविक है, लेकिन यह इष्टतम मामला होगा। – mpen

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