আমি মনে করি @ জ্যাকএইডলি ইতিমধ্যে এর সূচনাটি বলেছিলেন , তবে আমাকে এটি এইভাবে তৈরি করতে দিন:
ব্যতিক্রম ছাড়া (যেমন সি)
নিয়মিত কোড প্রবাহে আপনার কাছে:
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> 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";
… এটি না. মূলত, একটি ব্যতিক্রম একটি নিয়ন্ত্রণ প্রবাহ উপাদান নয় । এটি অপারেশনগুলিকেও আপনার কাছে অদ্ভুত দেখায় ("সেই সমস্ত জাভা ™ প্রোগ্রামাররা সর্বদা আমাদের জানান যে এই ব্যতিক্রমগুলি সাধারণ” ") এবং ডিবাগিংয়ের ক্ষেত্রে বাধা সৃষ্টি করতে পারে (যেমন আইডিইটিকে কেবল কোনও ব্যতিক্রম ভাঙার জন্য বলুন)। ব্যতিক্রমগুলির জন্য প্রায়শই রান-টাইম পরিবেশটি ট্রেসব্যাকগুলি তৈরি করার জন্য স্ট্যাকটি খুলে ফেলা প্রয়োজন etc. এটির বিরুদ্ধে সম্ভবত আরও কিছু কারণ রয়েছে।
এটি এটিকে ফুটিয়ে তোলে: কোনও ভাষা ব্যতিক্রমকে সমর্থন করে, বিদ্যমান যুক্তি এবং শৈলীর সাথে মেলে এবং প্রাকৃতিক অনুভব করে যা কিছু ব্যবহার করুন। যদি স্ক্র্যাচ থেকে কিছু লেখা হয় তবে তাড়াতাড়ি এ বিষয়ে সম্মত হন। যদি স্ক্র্যাচ থেকে কোনও লাইব্রেরি লিখতে থাকে তবে আপনার ভোক্তাদের কথা চিন্তা করুন। (হয় না, কখনও abort()
একটি লাইব্রেরিতে ব্যবহার করবেন না ...) তবে আপনি যা করেন না কেন, থাম্বের নিয়ম হিসাবে, অপারেশনটি সাধারণত পরে চলতে থাকলে (কম বা কম) ফেলে দেওয়া হবে না।
সাধারণ পরামর্শ ব্যতিক্রমসমূহ
প্রথমে পুরো দেব দলের দ্বারা সম্মত ব্যতিক্রমগুলির সমস্ত ইন-প্রোগ্রাম ব্যবহারের চেষ্টা করার চেষ্টা করুন। মূলত, তাদের পরিকল্পনা করুন। এগুলিকে প্রচুর পরিমাণে ব্যবহার করবেন না। কখনও কখনও, এমনকি সি ++, জাভা ™, পাইথন-এও একটি ত্রুটি রিটার্ন ভাল। কখনও কখনও এটি হয় না; তাদের চিন্তার সাথে ব্যবহার করুন।