2014-04-04 24 views
10

में गुजरने वाले त्रुटि संदेश के लिए $ @ का उपयोग करना मैं एक सीपीएएन मॉड्यूल के कांटा पर काम कर रहा हूं जो अब अनजान है (जहां तक ​​मैं कहने में सक्षम हूं)। इस मॉड्यूल में, वे स्टैक पर त्रुटि संदेशों को पारित करने के लिए [email protected] का उपयोग करते हैं। दूसरे शब्दों में, वे [email protected] सेट करते हैं यदि सबराउटिन पर किसी भी कॉल में कुछ भी गलत हो जाता है, और वे कॉल के बाद जांचते हैं कि यह सेट है या नहीं। मैंने पहले कभी इस चर को नहीं देखा था, लेकिन मैंने सोचा कि यह उपयोगी था, इसलिए मैंने इसे कोड में उसी तरह इस्तेमाल करना शुरू कर दिया। अब मैंने हाल ही में इसके बारे में कुछ और पढ़ा है, और पाया है कि इसका उद्देश्य इससे थोड़ा अधिक संकीर्ण है। perlvar (और इस मामले पर अन्य SO प्रश्न) पढ़ना मेरे लिए पूरी तरह से जवाब नहीं देता है, लेकिन, क्या इस तरह [email protected] का उपयोग करना ठीक है? मुझे पता है कि कुछ "विराम चिह्न" चर निश्चित रूप से इस तरह के सामान्य उद्देश्य के तरीके में उपयोग किए जाने चाहिए (कुछ local के साथ), क्या यह उन मामलों में से एक है, या क्या मैं इस अभ्यास को जारी रख रहा हूं?मॉड्यूल

उत्तर

1

[email protected] है


आमतौर पर त्रुटि से निपटने के लिए इस्तेमाल किया अन्य जादू चर $!, जो सी में errno की तरह काम करता

उदाहरण है पर्ल में एक अपेक्षाकृत "विशिष्ट" विशेष चर। पर्ल में कुछ भी [email protected] से कभी नहीं पढ़ता है, और यह केवल अंत में eval {} ब्लॉक द्वारा लिखा गया है। यह आपके स्वयं के त्रुटि-संकेत उद्देश्यों के लिए उपयोग करने के लिए अपेक्षाकृत सुरक्षित बनाता है।

विशेष रूप से, मॉड्यूल की कोर IO::Socket पेड़ इस का उपयोग निर्माता से विफलता का संकेत करने के लिए:

use IO::Socket::IP; 
my $sock = IO::Socket::IP->new(...) or die "Cannot connect - [email protected]"; 

अधिक परंपरागत $! यहाँ अनुपयुक्त है क्योंकि $! है जादू है कि libc स्तरीय लपेटता errno निर्माण; जिसका अर्थ है कि इसे केवल एक पूर्णांक errno मान पर सेट किया जा सकता है, भले ही इसे या तो संख्या या स्ट्रिंग के रूप में पढ़ा जा सके। क्योंकि कभी-कभी विफलता हो सकती है जो सीधे errno मानों (IO::Socket के मामले में, उदाहरण के लिए कई प्रकार की रिज़ॉल्वर विफलता) से संबंधित नहीं है, कभी-कभी $! इसके लिए अनुचित है।

4

[email protected] सामान्य रूप से स्पष्ट रूप से सेट नहीं होता है। इसके बजाय, अपवाद उठाए जाने पर यह स्वचालित रूप से आपके लिए सेट हो जाता है। perldoc die से:

  • मरने सूची

    die एक अपवाद को जन्म देती है। eval के अंदर त्रुटि संदेश [email protected] में भरा हुआ है और eval को अनिर्धारित मान के साथ समाप्त कर दिया गया है। यदि अपवाद eval एस के सभी संलग्नक के बाहर है, तो बेजोड़ अपवाद प्रिंट्स को STDERR पर सूचीबद्ध करता है और गैर-शून्य मान से बाहर निकलता है। यदि आपको किसी विशिष्ट निकास कोड के साथ प्रक्रिया से बाहर निकलने की आवश्यकता है, तो exit देखें।

उदाहरण के लिए,

#!/usr/bin/perl 

eval { 
    print "Hi\n"; 
    die "Something went wrong here"; 
    print "Bye\n"; 
}; 
print [email protected]; 

प्रिंट

Hi 
Something went wrong here at ./cr22854919 line 5. 

यह [email protected] उपयोग करने के लिए त्रुटि संदेश इस तरह से ढेर अप पारित करने के लिए अनुमति है try- का एक प्रकार के रूप में पकड़ने की व्यवस्था। हालांकि, चूंकि यह एक वैश्विक चर है, इसलिए इसे eval { } ब्लॉक के बाद जितनी जल्दी हो सके इसे संसाधित करना चाहिए ताकि यह सुनिश्चित किया जा सके कि कोई अन्य कोड अपवाद के आपके हैंडलिंग में हस्तक्षेप नहीं करता है।

my $path = "/tmp/no-such-file"; 
open F, '<', $path 
    or print STDERR "$path: $!\n"; 

आउटपुट::

/tmp/no-such-file: No such file or directory 
संबंधित मुद्दे