खोज…


eval and die

यह थर्ड पार्टी लाइब्रेरी पर ट्राई :: टिनी की तरह भरोसा किए बिना "अपवादों" से निपटने का अंतर्निहित तरीका है।

my $ret;

eval {
  $ret = some_function_that_might_die();
  1;
} or do {
  my $eval_error = $@ || "Zombie error!";
  handle_error($eval_error);
};

# use $ret

हम इस तथ्य का "दुरुपयोग" करते हैं कि die का गलत रिटर्न मूल्य है, और समग्र कोड ब्लॉक का रिटर्न मूल्य कोड ब्लॉक में अंतिम अभिव्यक्ति का मूल्य है:

  • यदि $ret को सफलतापूर्वक सौंपा गया है, तो 1; अभिव्यक्ति आखिरी बात यह है कि में होता है eval कोड ब्लॉक। इस तरह से eval कोड ब्लॉक का एक सही मूल्य है, इसलिए or do ब्लॉक ब्लॉक नहीं चलता है।
  • यदि some_function_that_might_die() करता है die , तो पिछले बात यह है कि में होता है eval कोड खंड है dieeval कोड ब्लॉक का इस प्रकार गलत मान होता है और or do ब्लॉक ब्लॉक चलता है।
  • पहली चीज जिसे आपको करना चाहिए or do जिसमें ब्लॉक किया गया है, वह $@ । यह वैश्विक वैरिएबल धारण करेगा जो die लिए तर्क दिया गया था। || "Zombie Error" गार्ड लोकप्रिय है, लेकिन सामान्य मामले में अनावश्यक है।

यह समझना महत्वपूर्ण है क्योंकि कुछ कॉल डाई को कॉल करके सभी कोड विफल नहीं होते हैं, लेकिन समान संरचना का उपयोग किया जा सकता है। एक डेटाबेस फ़ंक्शन पर विचार करें जो वापस आता है:

  • सफलता पर प्रभावित पंक्तियों की संख्या
  • यदि क्वेरी सफल है, लेकिन कोई पंक्तियाँ प्रभावित नहीं हुईं तो '0 but true'
  • 0 यदि क्वेरी सफल नहीं थी।

उस मामले में आप अभी भी एक ही मुहावरा उपयोग कर सकते हैं, लेकिन आप अंतिम छोड़ करने के लिए है 1; , और इस समारोह में अंतिम बात है। कुछ इस तरह:

eval {
  my $value = My::Database::retrieve($my_thing); # dies on fail
  $value->set_status("Completed");
  $value->set_completed_timestamp(time());
  $value->update(); # returns false value on fail
} or do { # handles both the die and the 0 return value
  my $eval_error = $@ || "Zombie error!";
  handle_error($eval_error);
};


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow