Os.Exit () और घबराहट () का उपयोग कब करें?


92

क्या कोई os.Exit()और के बीच के प्रमुख अंतरों को स्पष्ट कर सकता है panic()कि उन्हें गो में व्यवहार में कैसे उपयोग किया जाता है?


11
बस एक टिप्पणी जो भविष्य में गो कोड रीडिंग में आशातीत मदद करेगी: बहुत सारे उदाहरण कोड में, panicत्रुटि पर बाहर निकलने के लिए उपयोग किया जाता है, विशुद्ध रूप से इस तथ्य के कारण कि यह समझना आसान है, और किसी अन्य पैकेज को आयात करने से दूर करता है। इसका मतलब यह नहीं है कि यह अच्छा है, या मुहावरेदार अभ्यास है! । यह उदाहरण कोड के लिए केवल एक अंतरिक्ष बचत उपकरण है। IRL बहुत विशेष स्थितियों के panicलिए आरक्षित है।
इंटरमेरनेट

1
Hm..good) विशेष रूप से "IRL" संक्षिप्त नाम - यह मेरे लिए नया है :) क्या आप बता सकते हैं कि पैनिक पैकेज को कैसे समाप्त करता है?
तैमूर फैज़्रखमानोव

4
panicबिलियन है। यह अनुशंसित है (परिस्थिति के आधार पर) os.Exit, log.Fatalआदि जैसे कुछ का उपयोग करने के लिए , जो ओएस में एक त्रुटि कोड लौटाएगा (हमेशा यदि संभव हो तो अनुशंसित)। इन सभी में एक पैकेज आयात करना शामिल है, और इस प्रकार "अव्यवस्था" उदाहरण कोड है। उदाहरण कोड हमेशा किसी विशिष्ट समस्या के समाधान को प्रदर्शित करने के लिए लिया जाना चाहिए। कोड के साथ अन्य समस्याएं हो सकती हैं, जो ठीक से प्रदर्शित होने पर कोड को अधिक जटिल बनाते हैं, और इसलिए दिए गए उत्तर की व्याख्या से अलग हो जाते हैं। YMMV।
इंटरमेरनेट

1
ठीक है, मिल गया!) बड़ा धन्यवाद) मैं देख रहा हूँ कि मेरी शब्दावली के लिए अभी तक एक और संक्षिप्त नाम है :)
तैमूर फैज़्रखमानोव

2
एनपी, मदद करने के लिए खुश है, और अपने
संक्षिप्त

जवाबों:


84

सबसे पहले, जब भी आप एक "कैसे यह व्यवहार में प्रयोग किया जाता है" सवाल है, एक अच्छा तरीका शुरू करने के लिए करने के लिए है खोज जाओ स्रोत कोड (या किसी भी बड़ा पर्याप्त जाओ कोड बेस, वास्तव में), और पैकेज डॉक्स जवाब के लिए।

अब, os.Exitऔर panicकाफी अलग हैं। panicका उपयोग तब किया जाता है जब प्रोग्राम, या उसका हिस्सा, एक अपरिवर्तनीय स्थिति में पहुंच गया हो।

जब panicइसे रन-टाइम त्रुटियों के लिए कहा जाता है, जैसे कि एक स्लाइस को सीमा से बाहर करने या एक प्रकार के दावे को विफल करने के रूप में, यह तुरंत वर्तमान फ़ंक्शन का निष्पादन बंद कर देता है और जिस तरह से किसी भी अन्य प्रकार के कार्यों को चला रहा है, गोरोइन के ढेर को खोलना शुरू कर देता है। यदि वह अनियंत्रण गोरोइन के ढेर के शीर्ष तक पहुँच जाता है, तो कार्यक्रम मर जाता है।

os.Exitका उपयोग तब किया जाता है जब आपको तुरंत कार्यक्रम को निरस्त करने की आवश्यकता होती है , जिसमें पुनर्प्राप्ति की कोई संभावना नहीं होती है या एक आस्थगित क्लीन-अप स्टेटमेंट चल रहा होता है, और एक त्रुटि कोड भी लौटता है (जो अन्य प्रोग्राम रिपोर्ट करने के लिए उपयोग कर सकते हैं कि क्या हुआ)। यह परीक्षणों में उपयोगी है, जब आप पहले से ही जानते हैं कि यह एक परीक्षण विफल होने के बाद, दूसरा भी विफल हो जाएगा, इसलिए आप अभी भी बाहर निकल सकते हैं। इसका उपयोग तब भी किया जा सकता है जब आपके प्रोग्राम ने वह सब कुछ किया है जो उसे करने की आवश्यकता है, और अब बस मदद संदेश को प्रिंट करने के बाद, यानी बाहर निकलने की आवश्यकता है।

अधिकांश समय जो आप उपयोग नहीं करेंगे panic(आपको errorइसके बजाय वापस लौटना चाहिए ), और आपको os.Exitपरीक्षण में और त्वरित कार्यक्रम समाप्ति के लिए कुछ मामलों में लगभग कभी भी बाहर की आवश्यकता नहीं है ।


9
"यह परीक्षणों में उपयोगी है, जब आप पहले से ही जानते हैं कि यह एक परीक्षण विफल होने के बाद, दूसरा भी विफल हो जाएगा ..." यह परीक्षण पर निर्भर परीक्षणों के प्रतिमान की खुशबू आ रही है। एक अच्छी तरह से लिखित परीक्षण सूट में, प्रत्येक परीक्षण स्वतंत्र है; किसी भी परीक्षण के परिणाम को कभी भी किसी अन्य परीक्षण के परिणाम का निर्धारण नहीं करना चाहिए।
गेटगेन्स

1
@gotgenes जरूरी नहीं है। यदि मेरे पास एक परीक्षण है कि एक निश्चित फ़ंक्शन एक गैर-शून्य संरचना देता है, और वह परीक्षण विफल हो जाता है, तो मैं उम्मीद कर सकता हूं कि संरचना के मूल्यों की जांच करने वाले सभी परीक्षण विफल भी हो रहे हैं। यह कोड है जो निर्भर है, परीक्षण नहीं। (उस ने कहा, मैं exitउस मामले में उपयोग नहीं करूंगा , मैं सिर्फ असफल दावे के एक बड़े ढेर की उम्मीद करूंगा।)
डेविड मोल्स

83

सबसे पहले, os.Exit()एक त्रुटि के बिना सामान्य रूप से कार्यक्रम से बाहर निकलने के लिए इस्तेमाल किया जा सकता है, और आतंक नहीं है, इसलिए यह एक महत्वपूर्ण अंतर है। एक और बात यह है कि घबराहट को कहीं भी पकड़ा और नजरअंदाज किया जा सकता है recover

लेकिन अगर हम एक गलत निकास कोड के बारे में बात कर रहे हैं, तो हम कहते हैं:

panicजब कुछ गलत हो जाता है तो उपयोग करें , शायद एक प्रोग्रामर त्रुटि जो उत्पादन में जाने से पहले पकड़ा जाना चाहिए था। यही कारण है कि यह स्टैक प्रिंट करता है।

os.Exit(errorCode)यदि आप चाहते हैं कि कुछ का उपयोग करें या ऐसा कुछ करें :

  1. स्क्रिप्टिंग उद्देश्यों के लिए प्रोग्राम के निकास कोड को नियंत्रित करें।

  2. अपेक्षित त्रुटि पर एक क्रमबद्ध निकास चाहते हैं (जैसे उपयोगकर्ता इनपुट त्रुटि)।

तो मूल रूप से आतंक आपके लिए है, आपके उपयोगकर्ता के लिए एक बुरा निकास कोड है।


बहुत बहुत धन्यवाद!)
तैमूर फैज़्रखमानोव

14
"तो मूल रूप से आतंक आपके लिए है, आपके उपयोगकर्ता के लिए एक बुरा निकास कोड है।" <- विस्मयकारी टिप
psousa

1
क्या हम यह कह सकते हैं कि घबराहट () किसी तरह सामान्य सी से संबंधित है () सादे सी में कॉल? खैर .. मुझे पता है कि मैं हमेशा उत्पादन पर जोर देने से पहले जोरदार कॉल हटाता हूं, मैं केवल एक नई सुविधा का परीक्षण करते समय उन्हें सक्षम करता हूं। मैं जो कह रहा हूं वह यह है कि ज्यादातर समय मैं यह सुनिश्चित करने के लिए कि मैं अपने कोड में सही का अनुमान लगाता हूं, सत्यापित करने के लिए assert () का उपयोग करता हूं। क्या आपको घबराहट () के लिए समान उपयोग दिखाई देता है? :-)
यव्स ब्यूम्स

7

प्रमुख अंतर हैं:

  1. os.Exit स्थगित कार्य के निष्पादन को रोक देता है।
  2. इसके साथ os.Exit, आप बाहर निकलने का कोड निर्दिष्ट कर सकते हैं।
  3. panicजबकि समाप्त os.Exitनहीं है। (लगता है अन्य उत्तर इसका उल्लेख नहीं करते हैं।)

यदि आपको आस्थगित फ़ंक्शन को निष्पादित करने की आवश्यकता है, तो आपके पास कोई विकल्प नहीं है लेकिन panic। (दूसरी तरफ, यदि आप आस्थगित फ़ंक्शन के निष्पादन को छोड़ना चाहते हैं, तो उपयोग करें os.Exit।)

यदि एक गैर-शून्य फ़ंक्शन को इस तरह से परिभाषित किया गया है:

  1. फ़ंक्शन में बहुत सारी शाखाएं होती हैं
  2. सभी शाखाओं को returnया के साथ समाप्त कर दिया जाता हैpanic

तो फिर तुम बदल नहीं सकते panicके साथ os.Exitअन्यथा संकलक कार्यक्रम संकलन करने मना कर देगा, कि "समारोह के अंत में वापसी लापता"। (गो यहां बहुत गूंगा है, यहां तक ​​कि log.Panicएक समारोह भी समाप्त नहीं होता है।)

अन्य शर्तों के तहत:

  1. उपयोग करें panicजब कुछ वास्तव में वायर्ड होता है, जैसे कि लॉजिक त्रुटि।
  2. os.Exitनिर्दिष्ट निकास कोड के साथ, जब आप तत्काल निकास चाहते हैं, का उपयोग करें ।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.