2013-10-29 1 views
11

पर्ल वर्तमान में $SIG{__DIE__} लागू करता है इस तरह से यह किसी भी त्रुटि को प्रभावित करेगा, यहां तक ​​कि eval ब्लॉक के अंदर भी। यह वास्तव में उपयोगी संपत्ति है कि आप सटीक बिंदु पर कोड को रोक सकते हैं जहां त्रुटि होती है, वास्तविक त्रुटि का एक स्टैक ट्रेस एकत्र करें, इसे किसी ऑब्जेक्ट में लपेटें, और उसके बाद पैरामीटर के रूप में इस ऑब्जेक्ट के साथ मैन्युअल रूप से मर जाएं।पर्ल में रनटाइम त्रुटियों को पकड़ना और अपवादों में कनवर्ट करना

$SIG{__DIE__} का यह दुरुपयोग बहिष्कृत है। आधिकारिक तौर पर, आपको $SIG{__DIE__}*CORE::GLOBAL::die के साथ प्रतिस्थापित करना होगा। हालांकि, ये दो दूरस्थ रूप से समकक्ष नहीं हैं। *CORE::GLOBAL::die कहा जाता है जब रनटाइम त्रुटि होती है! यह सब स्पष्ट कॉल को die() पर प्रतिस्थापित करता है।

मुझे मरने की जगह में कोई दिलचस्पी नहीं है।

मैं विशेष रूप से रनटाइम त्रुटियों को पकड़ने में रूचि रखता हूं।

मुझे यह सुनिश्चित करने की ज़रूरत है कि किसी भी गलती पर, किसी भी गलती पर, किसी भी गलती पर किसी रनटाइम त्रुटि को पर्ल को मेरे पास नियंत्रण प्राप्त करने का कारण बनता है ताकि मैं स्टैक ट्रेस और रीथ्रो एकत्र कर सकूं। इसे एक eval ब्लॉक के अंदर काम करने की ज़रूरत है - एक या अधिक संलग्न उद्घाटन ब्लॉक अपवाद को पकड़ना चाहते हैं, लेकिन रनटाइम त्रुटि किसी भी मॉड्यूल के अंदर, किसी भी मॉड्यूल के अंदर बिना किसी इंजेक्शन के एक समारोह में हो सकती है।

$SIG{__DIE__} इस पूरी तरह से समर्थन करता है - और मुझे कुछ वर्षों या उससे अधिक के लिए ईमानदारी से सेवा दी गई है- लेकिन शक्तियां जो यह चेतावनी देती हैं कि इस शानदार सुविधा को किसी भी समय छीन लिया जा सकता है, और मुझे कोई बुरा आश्चर्य नहीं चाहिए लाइन के नीचे एक दिन।

आदर्श रूप से, पर्ल के लिए, वे इस उद्देश्य के लिए एक नया सिग्नल $SIG{__RTMERR__} बना सकते हैं (स्विचिंग सिग्नल काफी आसान है, मेरे लिए वैसे भी, क्योंकि यह केवल एक ही स्थान पर लगा हुआ है)। दुर्भाग्यवश, मेरी प्रेरक शक्तियां एक बोतल खोलने के लिए अल्कोहल का नेतृत्व नहीं करती हैं, इसलिए यह मानना ​​नहीं होगा कि रनटाइम त्रुटियों को साफ करने के इस उद्देश्य को वास्तव में कैसे प्राप्त किया जाना चाहिए?

(उदाहरण के लिए, एक और जवाब यहाँ की सिफारिश की कार्प :: हमेशा की तरह, जो ... भी हुक मर!)

उत्तर

3

बस इसे करते हैं। मेंने यह किया है। शायद इस हुक के बारे में जागरूक हर कोई इसे कर चुका है।

यह पर्ल; यह अभी भी दशकों से पहले संगत है। मैं यहां "बहिष्कृत" की व्याख्या करता हूं "कृपया इसका उपयोग न करें अगर आपको इसकी आवश्यकता नहीं है, तो, सकल"। लेकिन आपको इसकी आवश्यकता है, और प्रभावों को समझने लगते हैं, इसलिए इसके लिए इमो जाओ। मुझे गंभीरता से संदेह है कि एक अपरिवर्तनीय भाषा सुविधा जल्द ही जा रही है।

और सीपीएएन पर अपना काम जारी करें ताकि अगले देव को फिर से इसे फिर से शुरू करने की आवश्यकता न हो। :)

+0

इसे वर्षों से हटा दिया गया है, लेकिन इस प्रकार, कोई प्रतिस्थापन नहीं बताया गया है। इसका मतलब है कि यह बहिष्कृत नहीं है, या वे कार्यक्षमता को बनाए रखने का इरादा नहीं रखते हैं, या उन्होंने सही दृष्टिकोण को बताने के लिए बस उपेक्षित किया है। अगर आप कुछ हासिल करने का एकमात्र तरीका है तो आप कुछ महत्वपूर्ण नहीं कर सकते! शायद वे नहीं ... –

+3

[grep.cpan.me पर एक खोज] के अनुसार (http://grep.cpan.me/?q=__DIE__ [% 27% 22]% 3F \} + *% 3 डी) "1000 से अधिक वितरण" '$ SIG {__ DIE __}' का उपयोग कर रहे हैं। मुझे नहीं लगता कि यह कभी भी जाएगा ... –

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