আইএমও, তারা জাভা এবং সি # তে অন্তর্ভুক্ত রয়েছে কারণ তারা ইতিমধ্যে সি ++ তে বিদ্যমান ছিল। আসল প্রশ্নটি, তবে কেন সি ++ হয়। সি ++ এর ডিজাইন এবং বিবর্তন অনুসারে (.316.3):
tryশব্দ সম্পূর্ণরূপে অপ্রয়োজনীয় এবং তাই হয় { }যেখানে একাধিক বিবৃতি আসলে ব্যবহার করে দেখুন-ব্লক বা একটি হ্যান্ডলার ব্যবহার করা হয় ব্যতীত বন্ধনী। উদাহরণস্বরূপ, এটি অনুমতি দেওয়া তুচ্ছ হবে:
int f()
{
return g() catch(xxii) { // not C++
error("G() goofed: xxii");
return 22;
};
}
যাইহোক, আমি এটি ব্যাখ্যা করতে এতটা কঠিন বলে মনে করি যে বিভ্রান্ত ব্যবহারকারীদের থেকে সহায়তা কর্মীদের বাঁচানোর জন্য এই অতিরিক্ত কাজটি চালু করা হয়েছিল।
সম্পাদনা: এটি কেন বিভ্রান্তিকর হবে এ সম্পর্কে, আমি মনে করি যে কোনও সমস্যা হবে তা বোঝার জন্য @ টম জেফারির উত্তরের (এবং বিশেষত, এটি প্রাপ্ত ভোটের সংখ্যা) ভুল দাবীগুলি কেবলমাত্র দেখতে হবে। পার্সারের কাছে এটি elses এর সাথে মিলে যাওয়া থেকে আলাদা নয় if- অন্যান্য গ্রুপিংকে বাধ্য করার জন্য বন্ধনীগুলির অভাব রয়েছে, সমস্ত catch ধারাগুলি সাম্প্রতিকতমটির সাথে মিলবে throw। এটি অন্তর্ভুক্ত করে এমন দুর্বৃত্ত ল্যাঙ্গুয়াগগুলির জন্য, finallyধারাগুলিও এটি করবে। পার্সারের দৃষ্টিকোণ থেকে, বর্তমান পরিস্থিতিটি লক্ষ্য করা খুব কমই আলাদা - বিশেষত, ব্যাকরণকারীর এখন যেমন দাঁড়িয়েছে, তখন catchক্লোজগুলি একসাথে ভাগ করার মতো কিছুই নেই - বন্ধনীগুলি নিয়ন্ত্রিত বিবৃতিগুলিকে গ্রুপ করে দেয়catch ক্লজ, ধরুন না ক্লজগুলি নিজেরাই।
পার্সার লেখার দৃষ্টিকোণ থেকে, পার্থক্যটি লক্ষ্য করা প্রায় খুব ছোট। যদি আমরা এই জাতীয় কিছু দিয়ে শুরু করি:
simple_statement: /* won't try to cover all of this */
;
statement: compound_statement
| simple_statement
;
statements:
| statements statement
;
compound_statement: '{' statements '}'
catch_arg: '(' argument ')'
তারপরে পার্থক্যটি হবে:
try_clause: 'try' statement
এবং:
try_clause: 'try' compound_statement
তেমনিভাবে, ক্যাচ ক্লজগুলির জন্য:
catch_clause: 'catch' catch_arg statement
বনাম
catch_clause: 'catch' catch_arg compound_statement
সম্পূর্ণ চেষ্টা / ক্যাচ ব্লকের সংজ্ঞাটি এখনই পরিবর্তন করার প্রয়োজন হবে না। যে কোনও উপায়ে এটি এমন কিছু হবে:
catch_clauses:
| catch_clauses catch_clause
;
try_block: try_clause catch_clauses [finally_clause]
;
[এখানে আমি [whatever]somethingচ্ছিক কিছু নির্দেশ করতে ব্যবহার করছি এবং আমি সিনট্যাক্সটি একটি সময়ের জন্য ছেড়ে দিচ্ছি finally_clauseযেহেতু আমি মনে করি না যে এটির প্রশ্নের কোনও প্রভাব আছে]]
এমনকি যদি আপনি সেখানে সমস্ত ইয়্যাক-এর মতো ব্যাকরণ সংজ্ঞা অনুসরণ করার চেষ্টা না করেন, তবে বিন্দুটি মোটামুটি সহজেই সংক্ষিপ্ত করা যেতে পারে: শেষ বিবৃতিটি (শুরু দিয়ে try_block) এমন একটি যেখানে catchক্লজগুলি ক্লজগুলির সাথে মিলে যায় try- এবং এটি ঠিক একইভাবে থেকে যায় ধনুর্বন্ধনী প্রয়োজন হয় বা না একই।
/ সংক্ষেপে পুনরাবৃত্তি করতে: ধনুর্বন্ধনী গ্রুপ একসঙ্গে নিয়ন্ত্রিত বিবৃতি দ্বারাcatch গুলি কিন্তু কি না গ্রুপ catchনিজেদের s। যেমন, ঐ ধনুর্বন্ধনী একেবারে আছে কোন সিদ্ধান্ত যার উপর প্রভাব catchযা দিয়ে যায় try। পার্সার / সংকলকটির জন্য কার্য কোনওভাবেই সমানভাবে সহজ (বা কঠিন)। এটি সত্ত্বেও, @ টমের উত্তর (এবং এটি প্রাপ্ত ভোটের সংখ্যা) এই বাস্তবতার যথেষ্ট প্রমাণ দেয় যে এই জাতীয় পরিবর্তনটি অবশ্যই ব্যবহারকারীদের বিভ্রান্ত করবে ।
forঅংশগুলির জন্য কঠোরভাবে কথা বলার মতো কিছু নামকরণ করা উচিতinitial,conditionএবংstepযেমনinitialকোনও ভেরিয়েবল সংজ্ঞায়িত করা উচিত নয় এবংstepকোনও বৃদ্ধিও হবে না not