मुझे लगता है कि @JackAidley ने पहले ही कहा था , लेकिन मुझे इसे इस तरह तैयार करना चाहिए:
अपवाद के बिना (जैसे C)
नियमित कोड प्रवाह में, आपके पास:
if (condition) {
statement;
} else if (less_likely_condition) {
less_likely_statement;
} else {
least_likely_statement;
}
more_statements;
"जल्दी आउट होने की" स्थिति में, आपका कोड अचानक पढ़ता है:
/* demonstration example, do NOT code like this */
if (condition) {
statement;
} else {
error_handling;
return;
}
आप इस पद्धति का पता है - एक return
एक में else
(या if
) ब्लॉक, इसे तुरंत फिर से काम तो सवाल में कोड है नहीं एक है else
ब्लॉक:
/* only code like this at University, to please structured programming professors */
function foo {
if (condition) {
lots_of_statements;
}
return;
}
वास्तविक दुनिया में…
/* code like this instead */
if (!condition) {
error_handling;
return;
}
lots_of_statements;
यह बहुत गहरे घोंसले के शिकार से बचा जाता है और "ब्रेक आउट अर्ली" केस को पूरा करता है (दिमाग को रखने में मदद करता है - और कोड का प्रवाह - स्वच्छ) और " if
भाग में अधिक संभावना वाली चीज़" का उल्लंघन नहीं करता है क्योंकि बस कोई else
हिस्सा नहीं है ।
C
और सफाई
इसी तरह के एक प्रश्न के उत्तर से प्रेरित होकर (जो कि यह गलत है), यहां आप सी के साथ सफाई कैसे करते हैं। आप वहां एक या दो निकास बिंदुओं का उपयोग कर सकते हैं, यहां दो निकास बिंदुओं के लिए एक है:
struct foo *
alloc_and_init(size_t arg1, int arg2)
{
struct foo *res;
if (!(res = calloc(sizeof(struct foo), 1)))
return (NULL);
if (foo_init1(res, arg1))
goto err;
res.arg1_inited = true;
if (foo_init2(&(res->blah), arg2))
goto err;
foo_init_complete(res);
return (res);
err:
/* safe because we use calloc and false == 0 */
if (res.arg1_inited)
foo_dispose1(res);
free(res);
return (NULL);
}
यदि आप कम सफाई करते हैं, तो आप उन्हें एक निकास बिंदु में ध्वस्त कर सकते हैं:
char *
NULL_safe_strdup(const char *arg)
{
char *res = NULL;
if (arg == NULL)
goto out;
/* imagine more lines here */
res = strdup(arg);
out:
return (res);
}
यह उपयोग goto
पूरी तरह से ठीक है, अगर आप इससे निपट सकते हैं; उपयोग करने से दूर रहने की सलाह goto
उन लोगों पर निर्देशित की जाती है जो अभी तक स्वयं तय नहीं कर सकते हैं कि क्या उपयोग अच्छा, स्वीकार्य, बुरा, स्पेगेटी कोड, या कुछ और है।
अपवाद
उपरोक्त अपवादों के बिना भाषाओं के बारे में बात करते हैं, जो मैं खुद को बहुत पसंद करता हूं (मैं स्पष्ट रूप से बेहतर हैंडलिंग त्रुटि का उपयोग कर सकता हूं, और बहुत कम आश्चर्य के साथ)। Igli बोली के लिए:
<igli> exceptions: a truly awful implementation of quite a nice idea.
<igli> just about the worst way you could do something like that, afaic.
<igli> it's like anti-design.
<mirabilos> that too… may I quote you on that?
<igli> sure, tho i doubt anyone will listen ;)
लेकिन यहाँ एक सुझाव है कि आप इसे अपवाद वाली भाषा में कैसे अच्छा करते हैं, और जब आप उन्हें अच्छी तरह से उपयोग करना चाहते हैं:
अपवादों का सामना करने में त्रुटि
आप return
अपवाद को फेंकने के साथ अधिकांश शुरुआती एस को बदल सकते हैं। हालाँकि , आपका सामान्य प्रोग्राम फ्लो, अर्थात कोई भी कोड प्रवाह जिसमें प्रोग्राम का सामना नहीं हुआ, ठीक है, एक अपवाद ... एक त्रुटि स्थिति या सोमेसिक, कोई अपवाद नहीं बढ़ाएगा।
इस का मतलब है कि…
# this page is only available to logged-in users
if not isLoggedIn():
# this is Python 2.5 style; insert your favourite raise/throw here
raise "eh?"
… ठीक है, लेकिन…
/* do not code like this! */
try {
openFile(xyz, "rw");
} catch (LockedException e) {
return "file is locked";
}
closeFile(xyz);
return "file is not locked";
… नहीं है। असल में, एक अपवाद एक नियंत्रण प्रवाह तत्व नहीं है । इससे ऑपरेशन भी आपको अजीब लगते हैं ("उन जावा ™ प्रोग्रामर हमेशा हमें बताते हैं कि ये अपवाद सामान्य हैं") और डिबगिंग में बाधा डाल सकते हैं (उदाहरण के लिए आईडीई को किसी भी अपवाद को तोड़ने के लिए कहें)। अपवाद को अक्सर ट्रेसबैक का उत्पादन करने के लिए स्टैक को खोलने के लिए रन-टाइम वातावरण की आवश्यकता होती है, आदि इसके खिलाफ संभवतः अधिक कारण हैं।
यह उबलता है: अपवादों का समर्थन करने वाली भाषा में, मौजूदा तर्क और शैली से जो भी मेल खाता है उसका उपयोग करें और प्राकृतिक महसूस करें। यदि स्क्रैच से कुछ लिखना है, तो इस पर जल्दी सहमत हों। यदि स्क्रैच से लाइब्रेरी लिखना है, तो अपने उपभोक्ताओं के बारे में सोचें। (कभी भी, abort()
पुस्तकालय में उपयोग न करें ...) लेकिन आप जो भी करते हैं, अंगूठे के नियम के रूप में नहीं करते हैं, यदि अपवाद सामान्य रूप से इसके बाद भी (कम या ज्यादा) जारी रहता है, तो इसका अपवाद है।
सामान्य सलाह। अपवाद
पहले पूरी देव टीम द्वारा सहमत किए गए अपवादों के सभी इन-प्रोग्राम उपयोग को प्राप्त करने का प्रयास करें। मूल रूप से, उन्हें योजना। इनका भरपूर मात्रा में उपयोग न करें। कभी-कभी, C ++, Java ™, पायथन में भी, एक त्रुटि वापसी बेहतर होती है। कभी-कभी यह नहीं है; विचार के साथ उनका उपयोग करें।