আইএমও, তারা জাভা এবং সি # তে অন্তর্ভুক্ত রয়েছে কারণ তারা ইতিমধ্যে সি ++ তে বিদ্যমান ছিল। আসল প্রশ্নটি, তবে কেন সি ++ হয়। সি ++ এর ডিজাইন এবং বিবর্তন অনুসারে (.316.3):
try
শব্দ সম্পূর্ণরূপে অপ্রয়োজনীয় এবং তাই হয় { }
যেখানে একাধিক বিবৃতি আসলে ব্যবহার করে দেখুন-ব্লক বা একটি হ্যান্ডলার ব্যবহার করা হয় ব্যতীত বন্ধনী। উদাহরণস্বরূপ, এটি অনুমতি দেওয়া তুচ্ছ হবে:
int f()
{
return g() catch(xxii) { // not C++
error("G() goofed: xxii");
return 22;
};
}
যাইহোক, আমি এটি ব্যাখ্যা করতে এতটা কঠিন বলে মনে করি যে বিভ্রান্ত ব্যবহারকারীদের থেকে সহায়তা কর্মীদের বাঁচানোর জন্য এই অতিরিক্ত কাজটি চালু করা হয়েছিল।
সম্পাদনা: এটি কেন বিভ্রান্তিকর হবে এ সম্পর্কে, আমি মনে করি যে কোনও সমস্যা হবে তা বোঝার জন্য @ টম জেফারির উত্তরের (এবং বিশেষত, এটি প্রাপ্ত ভোটের সংখ্যা) ভুল দাবীগুলি কেবলমাত্র দেখতে হবে। পার্সারের কাছে এটি else
s এর সাথে মিলে যাওয়া থেকে আলাদা নয় 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