php “आखिर” कीवर्ड का उपयोग क्यों करें?




error-handling try-catch (2)

इस सवाल का पहले से ही यहाँ एक जवाब है:

मैं समझता हूं कि "अंत में" कीवर्ड का उपयोग विभिन्न भाषाओं में किस लिए किया जाता है, हालांकि, मैं यह समझने के लिए संघर्ष करता हूं कि आप इसे स्वाद में वरीयता स्वरूप होने के कारण इसका उपयोग क्यों करेंगे।

उदाहरण के लिए, PHP में:

try {
  possibleErrorThrownFunction();
}
catch (CustomException $customException) {
  // handle custom error
}
catch (Exception $exception) {
  // handle the error
}
finally {
  // run this code every single time regardless of error or not
}

यह कोड क्या कर रहा है और इसके बीच क्या अंतर है?

try {
  possibleErrorThrownFunction();
}
catch (CustomException $customException) {
  // handle custom error
}
catch (Exception $exception) {
  // handle the error
}

// run this code every single time regardless of error or not

क्या अंतिम पंक्ति हमेशा त्रुटि पकड़े जाने के कारण वैसे भी नहीं चलती है? किस मामले में, वास्तव में finally में उपयोग करने के लिए कोई मामला नहीं है जब तक कि आप सिर्फ एक कोड-शैली स्वरूपण को बनाए रखना चाहते हैं?

एक ऐसे मामले का उदाहरण जहां finally बयान आवश्यक है और कोशिश / कैच स्टेटमेंट के बाद कोड डालने से अलग है, अगर मैं यहां कुछ याद कर रहा हूं तो यह उपयोगी होगा।


संक्षिप्त जवाब

Finally ब्लॉक को इस बात की गारंटी दी जाती है कि प्रोग्राम को क्रैश करने की अनुमति देने से पहले try और catch ब्लॉक के अंदर क्या होता है।

यह यहाँ समझाया गया है: https://www.php.net/manual/en/language.exceptions.php यद्यपि विवरण विशेष रूप से विस्तृत है।

कुछ और विस्तार

एक उदाहरण जो मेरे सिर के शीर्ष पर आता है, यदि आप इनपुट / आउटपुट स्ट्रीम या कुछ समान के साथ काम कर रहे हैं जो कि मेमोरी रिसाव से बचने के लिए उपयोग के बाद बंद होना है। अपने उदाहरण का उपयोग करने के लिए:

try {
  memoryUser.startReading(someFileOrSomething);
}
catch (CustomException $customException) {
  // handle custom error
}
catch (Exception $exception) {
  // handle the error
  invisibleBug.whoops(); // i.e. something goes wrong in this block
}

memoryUser.Close(); // because something went wrong in the catch block,
                    // this never runs, which, in this case, causes a memory leak

इस मामले में, memoryUser.Close(); लपेटकर। memoryUser.Close(); finally ब्लॉक यह सुनिश्चित करेगा कि यह कार्यक्रम शेष कार्यक्रम से पहले चलेगा, अन्यथा एक भयावह विफलता में भी स्मृति रिसाव को रोका जा सकता है।

टी एल; डॉ

इसलिए बहुत बार, लोग एक महत्वपूर्ण लाइन रन सुनिश्चित करने के लिए अंततः ब्लॉक को वहां रख देते हैं, भले ही उन्होंने कैच ब्लॉक में कुछ अनदेखी की हो। इस तरह से मैंने हमेशा इसका इस्तेमाल किया है।

उम्मीद है कि यह मदद करता है :)


finally {} ब्लॉक के बारे में विशेष बात यह है कि यह हमेशा try {} ब्लॉक के अंत में चलेगा।

  • यदि try {} ब्लॉक कोड सफलतापूर्वक पूरा हो जाता है तो यह चलेगा।

  • यह कोशिश करेगा कि कोड try {} ब्लॉक में कोड एक अपवाद को फेंके जो एक catch {} द्वारा पकड़ा गया था। ( finally {} catch {} बाद चलता है।)

  • यह कोशिश करेगा कि कोड try {} ब्लॉक में कोड एक अपवाद को फेंके जो किसी भी catch {} ब्लॉक द्वारा नियंत्रित नहीं किया गया था, या यदि कोई भी नहीं था। ( finally {} ब्लॉक कॉल करने वाले को प्रचारित करने से पहले चलाता है।)

  • यह तब चलेगा जब try {} ब्लॉक कोड एक अपवाद फेंकता है, और कोड catch {} कोड एक और अपवाद फेंकता है (या उसी अपवाद को पुन: फेंकता है)।

  • यह तब भी चलेगा जब कोड try {} ब्लॉक, या catch {} ब्लॉक में होता है, return का उपयोग करता है। (बस एक अनकैप्ड अपवाद के साथ, finally {} फ़ंक्शन वास्तव में वापस आने से पहले चलता है।) finally {} ब्लॉक भी return उपयोग कर सकता है, और इसका रिटर्न मान उस मूल्य को ओवरराइड कर देगा, जिसे दूसरे ब्लॉक ने वापस करने की कोशिश की थी!

(एक किनारे का मामला है जहां finally {} ब्लॉक नहीं चलेगा, और अगर पूरी प्रक्रिया नष्ट हो जाती है, जैसे कि मारे जाने से, या exit() या die()







try-catch