मैं Erlang के लिए नया हूँ, लेकिन यहाँ है कि वे क्या, के लिए इस्तेमाल कर रहे हैं, मैं कैसे लगता है क्या इन बातों को, कर रहे हैं अपने मतभेदों के बारे आदि .:
throw
: एक शर्त है कि स्थानीय स्तर पर संभाला जाना चाहिए (यानी वर्तमान प्रक्रिया के भीतर)। जैसे कॉलर संग्रह में तत्व की तलाश में है, लेकिन यह नहीं जानता कि संग्रह में वास्तव में ऐसा तत्व है या नहीं; तो, कैलिली फेंक सकता है अगर ऐसा तत्व मौजूद नहीं है, और कॉलर try[/of]/catch
का उपयोग करके अनुपस्थिति का पता लगाता है। यदि कॉलर ऐसा करने की उपेक्षा करता है, तो यह nocatch
error
(नीचे समझाया गया) में बदल जाता है।
exit
: वर्तमान प्रक्रिया पूरी की जाती है। जैसे यह बस समाप्त हो गया है (उस स्थिति में, आप normal
पास करेंगे, जिसे मूल फ़ंक्शन रिटर्निंग के समान माना जाता है), या उसका ऑपरेशन रद्द कर दिया गया था (उदा। यह सामान्य रूप से अनिश्चित काल तक लूप करता है लेकिन उसे अभी shut_down
संदेश प्राप्त हुआ है)।
error
: प्रक्रिया कुछ किया है और/या एक राज्य है कि प्रोग्रामर नहीं (उदाहरण के लिए 1/0) को ध्यान में रखना था पर पहुंच गया, का मानना है कि असंभव है (उदाहरण के लिए case ... of
एक मूल्य है कि किसी भी मामले से मेल नहीं खाता का सामना करना पड़ता है), या कुछ पूर्व शर्त नहीं मिली है (जैसे इनपुट nonempty है)। इस मामले में, स्थानीय वसूली समझ में नहीं आता है। इसलिए, न तो throw
और न ही exit
उपयुक्त है। चूंकि यह अप्रत्याशित है, इसलिए एक स्टैक ट्रेस कारण का हिस्सा है।
आप देख सकते हैं, उपरोक्त सूची बढ़ते क्रम में है:
throw
समझदार की स्थिति है कि फोन करने वाले को संभालने के लिए आशा की जाती है के लिए है। अर्थात। हैंडलिंग वर्तमान प्रक्रिया के भीतर होती है।
exit
भी सचेत है, लेकिन प्रक्रिया पूरी होने के कारण वर्तमान प्रक्रिया को समाप्त करना चाहिए।
error
पागल है। कुछ ऐसा हुआ जो उचित रूप से (आमतौर पर एक बग?) से पुनर्प्राप्त नहीं किया जा सकता है, और स्थानीय रिकवरी उचित नहीं होगी।
बनाम अन्य भाषाओं:
throw
रास्ता के अनुरूप है जांचे हुए अपवादों जावा में किया जाता है। जबकि, error
अनचेक अपवादों के समान तरीके से उपयोग किया जाता है। चेक अपवाद अपवाद हैं जिन्हें आप कॉलर को संभालना चाहते हैं। जावा के लिए आपको या तो try/catch
में कॉल लपेटने की आवश्यकता है या यह घोषणा करें कि आपकी विधि throws
ऐसे अपवाद हैं। हालांकि, अनचेक अपवाद आम तौर पर बाहरीतम कॉलर को प्रचारित करते हैं।
exit
जावा, सी ++, अजगर, जावास्क्रिप्ट, रूबी, आदि exit
अस्पष्ट एक uber- return
की तरह की तरह अधिक "पारंपरिक" भाषाओं में एक अच्छा अनुरूप नहीं है: अंत में लौटने के बजाय, आप से लौट सकते हैं एक समारोह के बीच, सिवाय इसके कि आप वर्तमान कार्य से वापस नहीं आते हैं, आप उन सभी से वापस आते हैं।
exit
उदाहरण
serve_good_times() ->
receive
{top_of_the_mornin, Sender} ->
Sender ! and_the_rest_of_the_day_to_yourself;
{you_suck, Sender} ->
Sender ! take_a_chill_pill;
% More cases...
shut_down ->
exit(normal)
end,
serve_good_times()
end
serve_good_times
के बाद से कॉल ही लगभग के बाद सभी संदेशों, प्रोग्रामर का फैसला किया है कि हम उस कॉल को दोहराने के लिए हर मामले प्राप्त में नहीं करना चाहती। इसलिए, उसने को प्राप्त करने के बाद कॉल किया है। लेकिन फिर, क्या होगा अगर serve_good_times
खुद को कॉल करना बंद करने का फैसला करता है? यह वह जगह है जहां exit
बचाव के लिए आता है। normal
से exit
पास करने की प्रक्रिया को समाप्त करने का कारण बनता है जैसे अंतिम फ़ंक्शन कॉल वापस आ गया है।
इस प्रकार, आमतौर पर exit
को सामान्य प्रयोजन लाइब्रेरी में lists
पर कॉल करने के लिए अनुचित है। यह लाइब्रेरी का कोई भी व्यवसाय नहीं है कि प्रक्रिया समाप्त होनी चाहिए; यह आवेदन कोड द्वारा तय किया जाना चाहिए।
असामान्य exit
के बारे में क्या?
यह मायने रखती है, तो किसी अन्य प्रक्रिया ("दूरस्थ" प्रक्रिया) "स्थानीय" प्रक्रिया है कि exit
कॉल (और process_flag(trap_exit, true)
आमंत्रित नहीं किया गया) से जुड़ा हुआ है: बस लौटने पिछले समारोह की तरह, exit(normal)
दूरस्थ प्रक्रिया का कारण नहीं है बाहर निकलने के लिए । लेकिन यदि स्थानीय प्रक्रिया exit(herp_derp)
कॉल करती है, तो दूरस्थ प्रक्रिया Reason=herp_derp
से भी निकलती है। बेशक, अगर रिमोट प्रक्रिया अभी तक और अधिक प्रक्रियाओं से जुड़ा हुआ है, तो उन्हें Reason=herp_derp
के साथ एक्जिट सिग्नल भी मिलता है। इसलिए, गैर-normal
परिणाम श्रृंखला प्रतिक्रिया में निकलता है।
की कार्रवाई में इस पर एक नज़र डालें:
1> self().
<0.32.0>
2> spawn_link(fun() -> exit(normal) end).
<0.35.0>
3> self().
<0.32.0>
4>
4>
4> spawn_link(fun() -> exit(abnormal) end).
** exception exit: abnormal
5> self().
<0.39.0>
6>
पहली प्रक्रिया है कि हम पैदा की बाहर निकलने के लिए खोल का कारण नहीं (हम बता सकते हैं, क्योंकि self
से पहले और spawn_link
के बाद ही पीआईडी लौटे)। लेकिन दूसरी प्रक्रिया ने खोल को बाहर निकालने का कारण बनाया (और सिस्टम ने शैल प्रक्रिया को एक नए से बदल दिया)।
बेशक
, दूरस्थ प्रक्रिया process_flag(trap_exit, true)
का उपयोग करता है तो यह सिर्फ एक संदेश हो जाता है, स्थानीय प्रक्रिया से गुजरता है कि क्या normal
या exit
कुछ और की परवाह किए बिना। इस ध्वज को सेट करने से चेन प्रतिक्रिया बंद हो जाती है।
6> process_flag(trap_exit, true).
false
7> spawn_link(fun() -> exit(normal) end).
<0.43.0>
8> self().
<0.39.0>
9> flush().
Shell got {'EXIT',<0.43.0>,normal}
ok
10>
10>
10> spawn_link(fun() -> exit(abnormal) end).
<0.47.0>
11> self().
<0.39.0>
12> flush().
Shell got {'EXIT',<0.47.0>,abnormal}
याद मैंने कहा कि कि exit(normal)
लौटने मूल कार्य की तरह व्यवहार किया जाता है:
13> spawn_link(fun() -> ok end).
<0.51.0>
14> flush().
Shell got {'EXIT',<0.51.0>,normal}
ok
15> self().
<0.39.0>
क्या तुम जानते हो: एक ही बात है जब exit(normal)
बुलाया गया था के रूप में हुआ। आश्चर्यजनक!
आपकी मदद के लिए बहुत बहुत धन्यवाद। यह अब और अधिक स्पष्ट है। –
@ चेन्यू - मेरी मैला स्पष्टीकरण के लिए क्षमा चाहते हैं। rvirding - इसे साफ़ करने के लिए धन्यवाद। मुझे या तो मेरा जवाब ठीक/हटाने दें - कम भ्रम बेहतर! – Faiz