2010-05-19 15 views
14

मैं पर्ल सीख रहा हूँ, और उदाहरण मैं त्रुटियों को देखने का एक बहुत में इसपर्ल में त्रुटि प्रबंधन के लिए सर्वोत्तम अभ्यास क्या हैं?

open FILE, "file.txt" or die $!; 

तरह प्रबंधित किया जाता एक स्क्रिप्ट के बीच में die वास्तव में एक त्रुटि से निपटने के लिए सबसे अच्छा तरीका है?

+6

पर्ल अपवादों की चर्चा के लिए, देखें [पर्ल में अपवादों के बारे में क्या टूटा हुआ है?] (Http://stackoverflow.com/questions/2165161/whats-broken-about-exceptions-in-perl), [क्या आप एक का उपयोग करते हैं आपके पर्ल कार्यक्रमों में अपवाद वर्ग? क्यों या क्यों नहीं?] (Http://stackoverflow.com/questions/2439966/do-you-use-an-exception-class-in-your-perl-programs-why-or-why-not), और [ पर्ल में ऑब्जेक्ट उन्मुख अपवाद हैंडलिंग - क्या यह इसके लायक है?] (Http://stackoverflow.com/questions/503189/object-oriented-exception-handling-in-perl-is-it-worth-it) – Ether

उत्तर

21

चाहे die स्क्रिप्ट के बीच में उपयुक्त है वास्तव में आप जो कर रहे हैं उस पर निर्भर करता है। यदि यह केवल लाइनों के दसियों है, तो यह ठीक है। कुछ सौ लाइनों वाला एक छोटा सा उपकरण, फिर स्वीकार करें (नीचे देखें) पर विचार करें। यदि यह एक बड़ी वस्तु-उन्मुख प्रणाली है जिसमें बहुत से वर्ग और इंटरकनेक्टेड कोड हैं, तो हो सकता है कि एक अपवाद ऑब्जेक्ट बेहतर होगा। Carp पैकेज में

कबूल:
अक्सर बग कि मरने के लिए नेतृत्व लाइन है कि रिपोर्ट मरने पर नहीं है। कबूल के साथ मरने को बदलना (कार्प पैकेज देखें) स्टैक ट्रेस (हम इस लाइन में कैसे पहुंचे) दे देंगे जो डीबगिंग में बहुत मदद करता है।

पर्ल बिल्टिन से अपवादों को संभालने के लिए, मुझे autodie का उपयोग करना पसंद है। यह open और अन्य सिस्टम कॉल से विफलताओं को पकड़ता है और or die बिट करने के बिना, आपके लिए अपवाद फेंक देगा। Try::Tiny का उपयोग कर इन अपवादों को eval { }, या बेहतर अभी तक पकड़ा जा सकता है।

+4

+1। –

+1

मैंने हमेशा सोचा है कि उन्हें इसे 'autoOrDie'' कहना चाहिए :) – friedo

+0

@friedo यह 'लेखक डी' की तरह दिखता है :) – dolmen

3

कार्प मानक पुस्तकालय का उपयोग करने के लिए अधिक आधुनिक दृष्टिकोण है।

use Carp; 
my $fh; 
open $fh, '<', "file.txt" or confess($!); 

मुख्य लाभ यह मौत पर एक स्टैक ट्रेस देता है।

+0

खैर , जब तक आप कुछ अन्य कार्प चीजें सेट नहीं करते हैं, तब तक क्रोक एक स्टैक ट्रेस नहीं देता है। –

+0

@brian: व्हाओप, तय। –

+1

धन्यवाद! मुझे कार्प्स के बारे में पता नहीं था .... लेकिन जब से कार्प्स क्रोक करते हैं? – SystematicFrank

0

मैं मरने का उपयोग, लेकिन मैं त्रुटि हैंडलिंग पर नियंत्रण के लिए eval ब्लॉक में लपेट:

my $status = eval 
{ 
    # Some code... 
}; 

'eval' में विफल रहता है:

  1. $status अपरिभाषित हो जाएगा।
  2. [email protected] जो कुछ त्रुटि संदेश उत्पादन किया गया था पर निर्धारित किया जाएगा (या एक die की सामग्री)

'eval' सफल होती है:

  1. $status के अंतिम दिए गए मान हो जाएगा ब्लॉक।
  2. [email protected] '' पर सेट किया जाएगा।
+5

'eval {}' के साथ समस्याएं हैं जिनमें अस्पष्ट कार्य-आस-पास की आवश्यकता है। इसके बजाए कोशिश करें :: छोटे। यह स्वच्छ, उपयोग में आसान पैकेज में सभी घातक बॉयलरप्लेट को लपेटता है। – daotoad

+1

'eval {} 'के साथ समस्याएं हैं जिनमें अस्पष्ट कार्य-आस-पास की आवश्यकता है ... यदि आप त्रुटि की पहचान करने की परवाह करते हैं। यदि आप इसके कारण के बावजूद एक ही कार्रवाई करने जा रहे हैं, तो एक सरल ब्लॉक 'eval' ठीक काम करता है। लेकिन, हाँ: अन्य सभी मामलों में 'Try :: Tiny' का उपयोग करें। –

+0

अगली बार जब मैं कुछ पर्ल लिखता हूं तो मैं कोशिश करूँगा। मैं नकली कोशिश करने के लिए इस तरह का उपयोग करता हूं (eval ब्लॉक के बाद $ @ की एक चेक जोड़कर।) युक्तियों के लिए धन्यवाद। 'Autodie' का सुझाव देने के लिए –

12

चूंकि मैं लगभग हर जगह Log::Log4perl का उपयोग करता हूं, मैं die के बजाय $logger->logdie का उपयोग करता हूं। और यदि आप अपने अपवादों पर अधिक नियंत्रण रखना चाहते हैं, तो Exception::Class पर विचार करें।

Try::Tiny के साथ अपने अपवादों को पकड़ना बेहतर है (इसके दस्तावेज़ देखें क्यों)।

6

जब तक आपको एक और विशिष्ट विचार नहीं मिला है, तो हाँ जब आप अप्रत्याशित चीजें होती हैं तो आप मरना चाहते हैं।

  • एक फ़ाइल को खोलने की विफलता पर मर रहा है और फ़ाइल नाम देने से नहीं पढ़ सकते हैं या एक गुमनाम अपरिभाषित को लिखने तुमसे कह प्रणाली से बेहतर है।

  • यदि आप "स्क्रिप्ट" के बारे में बात कर रहे हैं, तो सामान्य रूप से आप कोड के एक बहुत ही साधारण टुकड़े के बारे में बात कर रहे हैं। ऐसी परतें नहीं जिन्हें समन्वय की आवश्यकता होती है (आमतौर पर नहीं)। एक पर्ल मॉड्यूल में, एक सहायक विचार यह है कि आपके पास निष्पादन वातावरण का स्वामित्व नहीं है, इसलिए मुख्य सॉफ्टवेयर परवाह है और यह चीजों को एक eval में पकड़ता है, या यह वास्तव में परवाह नहीं है और मरना ठीक होगा। हालांकि, एक मॉड्यूल के रूप में आपको थोड़ी अधिक मजबूती से प्रयास करना चाहिए और केवल अपरिचित या कुछ वापस पास करना चाहिए।

  • आप एक eval ब्लॉक में जो कुछ भी मर जाता है (या क्रोक) पकड़ सकते हैं। और आप वहां अपना अधिक विशिष्ट हैंडलिंग कर सकते हैं।

  • लेकिन यदि आप $ का निरीक्षण करना चाहते हैं! तो उस कोड को लिखें, और आपके पास एक और अधिक विशिष्ट संकल्प होगा।

  • strict का उपयोग करने के निकट-सार्वभौमिक मानक पर नज़र डालें। यह कोड है जो आपको जारी रखने की बजाय, संदिग्ध वाक्यविन्यास पर मर जाता है।

तो मुझे लगता है सामान्य विचार है: हाँ, मर जब तक आप कैसे चीजें संभाला जाना चाहिए का एक बेहतर विचार है। यदि आप इसमें पर्याप्त दूरदर्शिता डालते हैं, तो आपको मरने वाले एक या दो बार क्षमा किया जा सकता है, क्योंकि आप जानते हैं आपको इसकी आवश्यकता नहीं है।

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

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