perl - कार्प/क्रोक, क्लक/कॉन्फिस, और वर्बोज़ विकल्पों के बीच क्या अंतर है?




error-handling carp (2)

मैंने कार्प का इतना उपयोग नहीं किया है क्योंकि मैंने आम तौर पर अपना खुद का लुत्फ उठाया है। हालांकि, कोर मॉड्यूल के साथ रखने की भावना में, अब मैं इसका उपयोग कर रहा हूं। हालांकि, ऐसा लगता है कि यह चेतावनी / मरने से भी बेहतर है।

इसके अलावा, क्या अटक / कबूल / वर्बोज़ भी करता है? आउटपुट के बारे में एक विचार प्राप्त करने के लिए मैंने इस छोटी लिपि को चलाया है (क्योंकि कार्प डॉक्स इसे नहीं करते हैं)। यह किसी भी रन (यादृच्छिक तारों के अलावा) पर बिल्कुल वही दिखता है।

  #!/usr/bin/perl

  package Warning;

  sub warning {
    warn "warn";
  }

  package CWarn;
  use Carp qw(carp cluck);

  sub cwarn {
    int(rand(2)) ? carp "carp" : cluck "cluck";
  }

  package Fatal;
  use Carp qw(confess croak);

  sub fatal {
    int(rand(2)) ? confess "confess" : croak "croak";
  }

  package Loop;

  use v5.10;

  sub loop {
    say '=' x 80;
    Warning::warning();
    CWarn::cwarn();
    loop() unless ($c++ > 10);
    Fatal::fatal();
  }

  package main;

  Warning::warning();
  CWarn::cwarn();
  Loop::loop();

अद्यतन: स्क्रिप्ट को पैकेज नामों के साथ अपडेट किया गया है और इससे कोई फर्क पड़ता है। हालांकि, लॉगिंग जानकारी के मामले में कार्प अभी भी बहुत बुनियादी है, और यह वेब आउटपुट का समर्थन नहीं करता है। मुझे लगता है कि मैं सीजीआई :: कार्प, लॉग :: आउटपुट, और लॉग :: लॉग 4Perl जैसे अन्य लोगों को देखूंगा।


आपके उदाहरण के साथ समस्या यह है कि आपके सभी सब एक ही पैकेज में हैं (डिफ़ॉल्ट पैकेज: main )। यह उस मामले का उपयोग नहीं है जिसे Carp लिए डिज़ाइन किया गया था।

कार्प मॉड्यूल में इस्तेमाल किया जाना है। इसका कारण यह है कि जब एक मॉड्यूल में कोई समस्या आती है, तो अक्सर ऐसा होता है क्योंकि मॉड्यूल के कॉलर ने इसे खराब डेटा पास कर दिया है। इसलिए, उस मॉड्यूल की रिपोर्ट करने के बजाय जहां मॉड्यूल ने समस्या की खोज की, मॉड्यूल को कॉल करने के लिए आमतौर पर अधिक उपयोगी होता है (मॉड्यूल के बाहर कोड से)। कार्प डू द्वारा निर्यात किए गए कार्यों को यही है।

हां / नहीं विकल्पों के 2 सेट हैं। समारोह घातक ( die तरह) या nonfatal ( warn तरह) हो सकता है। यह केवल उस पंक्ति की रिपोर्ट कर सकता है जहां फ़ंक्शन कहा जाता था, या यह एक पूर्ण बैकट्रैक की रिपोर्ट कर सकता है।

         Fatal  Backtrace
carp       N        N
cluck      N        Y
croak      Y        N
confess    Y        Y

वर्बोज़ विकल्प बैकट्रैस पर बल देता है। यही है, यह carp एक्ट को cluck तरह बनाता है, और croak अधिनियम को confess । आप इसका उपयोग तब कर सकते हैं जब आपको एहसास हो कि आपको अधिक डीबगिंग जानकारी चाहिए, लेकिन confess करने के लिए कोड को बदलना नहीं चाहते confess


Carp warn / die से बेहतर है जिसमें यह त्रुटि और फेंकने की बजाए फ़ंक्शन को फेंकने वाली फ़ंक्शन कहलाता है। यह अक्सर पुस्तकालयों के लिए उपयोगी हो सकता है। (उदाहरण के लिए, डेटाबेस लाइब्रेरी को शायद त्रुटियों को फेंकना चाहिए कि यह इंगित करता है कि गलत डेटाबेस कॉल कहां है, बजाय एक पंक्ति को इंगित करने के बजाय।)

carp , cluck , croak , और confess आपको विकल्पों के चार संयोजन देते हैं:

  • carp : घातक नहीं, कोई पीछे नहीं
  • cluck : बैकट्रैस के साथ घातक नहीं
  • croak : घातक, कोई पीछे नहीं
  • confess : बैकट्रैक के साथ घातक




carp