2016-10-27 12 views
9

पृष्ठभूमि

try/rescue और try/catch दोनों इलीक्सिर में त्रुटि प्रबंधन तकनीकों हैं। परिचय मार्गदर्शिका में corresponding chapter के अनुसार।Elixir - कोशिश/पकड़ बनाम कोशिश/बचाव?

त्रुटियाँ try/rescue निर्माण

दूसरी ओर,

throw और catch स्थितियों में, जहां यह संभव मान प्राप्त करने के लिए जब तक का प्रयोग नहीं कर रहा है के लिए आरक्षित हैं का उपयोग कर बचाया जा सकता है throw और catch

संदेह

मैं एक संक्षिप्त समझ के साथ कि rescue त्रुटियों के लिए है। जबकि catch किसी भी कीमत के लिए है।

हालांकि,

  • मैं अमृत में तंत्र से निपटने त्रुटि का इस्तेमाल करते हैं कब करना चाहिए?
  • विस्तार से उनके बीच अंतर क्या हैं?
  • मुझे किसी विशिष्ट उपयोग मामले में उपयोग करने के लिए कैसे चुनना चाहिए?
  • 'ऐसी स्थितियां हैं जहां throw और catch' का उपयोग करके एक मूल्य पुनर्प्राप्त करना संभव नहीं है?
+3

आपको उनका बिल्कुल उपयोग नहीं करना चाहिए;) यह जावा नहीं है कि आप सभी त्रुटियों को 'कोशिश/पकड़ना' चाहते हैं। आपको पर्यवेक्षकों का उपयोग करना चाहिए जब आपके ऐप को मजबूत बनाने के लिए त्रुटि हुई या जब भी त्रुटि होनी चाहिए, तब तक उठाएं। – PatNowak

+0

संभावित डुप्लिकेट [कौन सी स्थितियों को इलीक्सिर में थ्रो/कैच की आवश्यकता है?] (Http://stackoverflow.com/questions/36036480/which-situations-require-throw-catch-in-elixir) –

उत्तर

14

यह एक अच्छा सवाल है। थोड़ा सा शोध करने के बाद।

  • विवरणों में उनके बीच अंतर क्या है?

    जोस के जवाब:

मुख्य रूप से, आप नियंत्रण प्रवाह और त्रुटियों के लिए आरक्षित raise, जो डेवलपर गलतियों पर या असाधारण परिस्थितियों में होता है के लिए throw उपयोग करना चाहिए।

अमृत में, इस तरह के अंतर बल्कि सैद्धांतिक है, लेकिन वे में कोई फर्क रूबी, जहां नियंत्रण प्रवाह के लिए त्रुटियों/अपवाद का उपयोग कर महंगा है, क्योंकि अपवाद वस्तु बनाने और पश्व-अनुरेखन महंगा है जैसे कुछ भाषाओं।

  • मैं एक एक विशिष्ट उपयोग के मामले में उपयोग करने के लिए चयन कैसे करना चाहिए?

कृपया इस जवाब Which situations require throw catch in Elixir

कुछ ही समय की जाँच करें:

raise/rescue

स्पष्ट रूप से अपवाद हैंडलिंग (प्रोग्रामर त्रुटियों जैसे कुछ अप्रत्याशित स्थिति, गलत पर्यावरण, आदि) के बारे में होने/बचाव जुटाने पर विचार करें।

throw/catch

स्थानों पर जहां आप विफलताओं की उम्मीद है में उपयोगी है। क्लासिक उदाहरण हैं:

अंतिम एक:

  • 'ऐसी स्थितियां कहां हैं जहां फेंकने और पकड़ने के द्वारा मूल्य को पुनर्प्राप्त करना संभव नहीं है?

मान लें कि आप Supervisor द्वारा पर्यवेक्षित प्रक्रिया से कुछ कोड चलाने की कोशिश कर रहे हैं लेकिन प्रक्रिया एक अप्रत्याशित कारण के लिए मर जाती है।

try do 
IO.inspect MayRaiseGenServer.maybe_will_raise 
rescue 
    RuntimeError -> IO.puts "there was an error" 
end 

MayRaiseGenServer एक Supervisor की देखरेख कर रहा है और किसी कारण के लिए एक त्रुटि मिली:

try do 
IO.inspect MayRaiseGenServer.maybe_will_raise # <- Code after this line is no longer executed 

और फिर आप पकड़ यहाँ एक अपवाद का उपयोग कर के साथ आ सकते हैं:

try do 
    IO.inspect MayRaiseGenServer.maybe_will_raise 
catch 
    :exit, _ -> IO.puts "there was an error" 
end 

ठीक है जो कुछ भी हम स्पष्ट कर रहे हैं उसे स्पष्ट करते हैं।

+1

आपके शोध के लिए धन्यवाद, अच्छा स्पष्टीकरण :) – Gavin

+0

आपका स्वागत है :) – TheAnh