কেন চেষ্টা করার জন্য বন্ধনী প্রয়োজন?


38

বিভিন্ন ভাষায় (জাভা কমপক্ষে, সি # টিও ভাবেন) আপনি পছন্দ মতো কাজ করতে পারেন

if( condition )
    singleStatement;

while( condition )
    singleStatement;

for( var; condition; increment )
    singleStatement;

সুতরাং যখন আমার কেবল একটি বিবৃতি থাকবে, তখন আমার সাথে একটি নতুন সুযোগ যুক্ত করার দরকার নেই { }। আমি চেষ্টা করে কেন এটি করতে পারি না?

try
    singleStatement;
catch(Exception e)
    singleStatement;

ট্রাই-ক্যাচ সম্পর্কে কি এমন কোনও বিশেষত্ব রয়েছে যার জন্য সর্বদা নতুন সুযোগ বা কিছু থাকা প্রয়োজন? এবং যদি তাই হয়, সংকলক এটি ঠিক করতে পারে না?


3
নীট-পিকিং এখানে: forঅংশগুলির জন্য কঠোরভাবে কথা বলার মতো কিছু নামকরণ করা উচিত initial, conditionএবং stepযেমন initialকোনও ভেরিয়েবল সংজ্ঞায়িত করা উচিত নয় এবং stepকোনও বৃদ্ধিও হবে না not
জোছিম সউর

4
পার্শ্ব নোট হিসাবে ডি একক স্টেটমেন্টের চারপাশে ধনুর্বন্ধনী প্রয়োজন হয় না ধরা ধরার চেষ্টা করুন
ratchet freak

13
আমি মনে করি আসল প্রশ্নটি অন্যভাবে হয়: কেন কিছু সংস্থাগুলি "নগ্ন" বিবৃতি দেওয়ার অনুমতি দেয়? ধারাবাহিকতার জন্য ব্রেসগুলি সর্বত্র বাধ্যতামূলক হওয়া উচিত।
আঙ্কেলজিভ

3
@ ইউঙ্কলেজিভ - আপনি যদি বিবেচনা করেন যে যা অনুসরণ করে ifতা সর্বদা একটি বিবৃতি, এবং ধনুর্বন্ধনী দ্বারা আবদ্ধ একাধিক বিবৃতিতে একটি বিবৃতি থাকে r তবে আমি তাদের মধ্যে যারা সর্বদা যাইহোক ধনুর্বন্ধনী
রেখেছি

1
আমি ব্রেসগুলিও লেখার প্রবণতা রাখি, তবে আমার পছন্দ মতো throwএবং যখন সরাসরি প্রস্থান পয়েন্ট থাকে তখন সেগুলি লিখতে আমি পছন্দ করি না return, এবং @ যেমনটি বলেছিলেন, আপনি যদি ব্রেসগুলি একক বিবৃতি হিসাবে বিবেচনা করেন তবে আমি এটি খুঁজে পাই না অসামঞ্জস্যপূর্ণ। লোকেদের দ্বারা উল্লিখিত এই "প্রচুর কোডিং ত্রুটিগুলি" কী তা আমি কখনই বুঝতে পারি নি। লোকেরা তাদের কাজগুলিতে মনোযোগ দেওয়া শুরু করতে হবে, যথাযথ ইনডেনশন ব্যবহার করতে হবে এবং ইউনিট পরীক্ষা করতে হবে: পি এর সাথে কখনও সমস্যা হয়নি ...
Svish

উত্তর:


23

আইএমও, তারা জাভা এবং সি # তে অন্তর্ভুক্ত রয়েছে কারণ তারা ইতিমধ্যে সি ++ তে বিদ্যমান ছিল। আসল প্রশ্নটি, তবে কেন সি ++ হয়। সি ++ এর ডিজাইন এবং বিবর্তন অনুসারে (.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। পার্সার / সংকলকটির জন্য কার্য কোনওভাবেই সমানভাবে সহজ (বা কঠিন)। এটি সত্ত্বেও, @ টমের উত্তর (এবং এটি প্রাপ্ত ভোটের সংখ্যা) এই বাস্তবতার যথেষ্ট প্রমাণ দেয় যে এই জাতীয় পরিবর্তনটি অবশ্যই ব্যবহারকারীদের বিভ্রান্ত করবে


ওপি প্রায় উভয় ব্যবহার করে দেখুন এবং বন্ধনী সম্পর্কে জিজ্ঞাসা করা হয় ধরা ব্লক , যখন এই প্রদর্শিত হয় পরিষদবর্গকে উল্লেখ করা চেষ্টা আপনি (প্রথম অনুচ্ছেদ উভয় রেফারেন্স বোঝা যায়নি, কিন্তু কোড শুধুমাত্র সাবেক প্রকাশ) ... পারি নির্মল?
শোগ 9

@ মিঃসিআরটিটি: একটি "ক্যাচ ব্লক" অন্যথায় "হ্যান্ডলার" হিসাবে পরিচিত হবে, যার উপরের উদ্ধৃতিটি দেখুন।
জেরি কফিন

3
বাহ, এই অস্পষ্টতাটি সরাতে আমার মন্তব্য সম্পাদনা করেছেন । আমি যা পাচ্ছি তা হ'ল এটি যদি টম-এর (উপরের) চেয়ে আরও কার্যকর উত্তর হতে পারে তবে বন্ধনীর চেয়ে কম নির্মাণ কীভাবে কাজ করতে পারে তা চিত্রিত করার জন্য এটি যদি আরও দীর্ঘস্থায়ী হয় তবে বিভ্রান্তিকর উপায়ে (টমের উত্তর সম্পর্কে বিলির মন্তব্য মনে হয়) বোঝাতে যে এটি কাজ করতে পারে না , যা আমি বিশ্বাস করি ভুল)।
শোগ 9

@ জেরি কফিন আপনার উত্তরটি প্রসারিত করার জন্য ধন্যবাদ: এটি এখন আমার কাছে আরও স্পষ্ট।

try return g(); catch(xxii) error("G() goofed: xxii");যে এখনও ঝরঝরে হয়েছে IMO
alfC

19

ইন কেন বন্ধনী কিছু একক বিবৃতি নির্মান কিন্তু অন্যরা না জন্য প্রয়োজন হয় সম্পর্কে একটি উত্তর , এরিক Lippert লিখেছিলেন:

এমন অনেকগুলি জায়গা রয়েছে যেখানে "# নগ্ন" বিবৃতি দেওয়ার পরিবর্তে সি # এর ব্রেসড ব্লক স্টেটমেন্ট দরকার। তারা হ'ল:

  • কোনও পদ্ধতির বডি, কনস্ট্রাক্টর, ডেস্ট্রাক্টর, সম্পত্তি অ্যাকসেসর, ইভেন্ট অ্যাকসেসর বা সূচক এক্সেসর or
  • একটি প্রচেষ্টা, ধরা, অবশেষে, চেক করা, চেক করা বা অনিরাপদ অঞ্চল ব্লক।
  • একটি বিবৃতি লাম্বদা বা বেনামি পদ্ধতিতে ব্লক
  • if বা লুপ স্টেটমেন্টের ব্লকটিতে যদি একটি স্থানীয় ভেরিয়েবল ঘোষণা থাকে। (এটি, "যখন (x! = 10) ইন্টি ওয়াই = 123;" অবৈধ; আপনাকে এই ঘোষণাটি বন্ধন করতে হবে))

এই প্রতিটি ক্ষেত্রেই বৈশিষ্ট্যটির জন্য যেখানে একটি একক অবিশ্বাসিত বিবৃতি বৈধ, সেখানে একটি দ্ব্যর্থহীন ব্যাকরণ (বা একটি অস্পষ্ট ব্যাকরণ বিমূ .় করার জন্য তাত্ত্বিকতা) নিয়ে আসা সম্ভব হবে। তবে কী হবে? এই পরিস্থিতিতে প্রতিটি আপনি একাধিক বিবৃতি দেখতে প্রত্যাশা করছেন; একক বিবৃতি বিরল, অসম্ভব ক্ষেত্রে। দেখে মনে হচ্ছে এগুলি খুব সম্ভাব্য ক্ষেত্রে ব্যাকরণটিকে দ্ব্যর্থহীন করে তোলা বাস্তবসম্মত নয়।

অন্য কথায়, সংষ্কৃতকারী দলের পক্ষে এটি প্রযোজ্য প্রান্তিক সুবিধার্থে ন্যায়সঙ্গত হওয়ার চেয়ে এটি বাস্তবায়ন করা আরও ব্যয়বহুল ছিল।


13

আমি মনে করি এটি অন্য স্টাইলের সমস্যাগুলি এড়ানো এড়ানো। নিম্নলিখিতটি অস্পষ্ট হবে ...

try
    // Do stuff
try
    // Do  more stuff
catch(MyException1 e1)
    // Handle fist exception
catch(MyException2 e2)
    // So which try does this catch belong to?
finally
    // and who does this finally block belong to?

এটি এর অর্থ হতে পারে:

try {
   try {

   } catch(Exception e1) {

   } catch(Exception e2) {

   } 
} finally {

} 

অথবা ...

try {
   try {

   } catch(Exception e1) {

   } 
} catch(Exception e2) {

} finally {

} 

24
এই অস্পষ্টতা ক্ষেত্রে প্রযোজ্য যদি এবং জন্য সমানভাবে। প্রশ্ন হল কেন এটা যে এটি অনুমোদিত হয় যদি এবং সুইচ বিবৃতি কিন্তু না ব্যবহার করে দেখুন / ধরা ?
দিপান মেহতা

3
@ দিপান ফর্সা পয়েন্ট আমি আশ্চর্য হই যে এটি জাভা / সি # এর কোনও বিষয় যেমন সি-র মতো পুরানো ভাষার সাথে নন-ব্র্যাসেড আইএফএসকে অনুমতি দিয়ে সামঞ্জস্য রাখার চেষ্টা করছে। যেখানে চেষ্টা / ধরা একটি নতুন নির্মাণ, তাই ভাষা ডিজাইনাররা thoughtতিহ্যকে ভেঙে ফেলা ঠিক বলে মনে করেছিলেন।
টম জেফেরিস

আমি কমপক্ষে সি এবং সি ++ এর জন্য বাধ্যবাধকতার জবাব দেওয়ার চেষ্টা করেছি।
দিপান মেহতা

6
@ দিপনমহেতা: কারণ মামলার একাধিক সম্ভাব্য ঝোঁক নেই if। এটি কেবল "অন্যথায় অভ্যন্তরীণ সাথে ভালভাবে আবদ্ধ হয়" বলা এবং এটি দিয়ে করা সহজ। কিন্তু চেষ্টা / ধরার জন্য যা কাজ করে না।
বিলি ওনিল

2
@ বিলি: আমি মনে করি আপনি যদি উপস্থিত / সম্ভাব্য অস্পষ্টতা সম্পর্কে চিত্তাকর্ষক হন তবে / অন্যথায় ... "এটি বলা ঠিক সহজ" বলা সহজ - তবে এর কারণ এই যে অস্পষ্টতাকে সমাধান করার পক্ষে একটি কঠোর নিয়ম রয়েছে যা ঘটনাক্রমে অস্বীকার করে না বন্ধনী ব্যবহার না করে নির্দিষ্ট কিছু নির্মাণ। জেরির উত্তরটি বোঝায় যে এটি বিভ্রান্তি এড়ানোর জন্য করা একটি সচেতন পছন্দ ছিল , তবে অবশ্যই এটি কাজ করতে পারে - ঠিক যেমন / যদি অন্যথায় এটি "কাজ করে"।
শোগ 9

1

আমি মনে করি এর মূল কারণটি হ'ল আপনি সি # তে খুব কম কাজ করতে পারেন যার জন্য চেষ্টা / ক্যাচ ব্লক দরকার যা কেবলমাত্র একটি লাইন। (আমি এখনই আমার মাথার শীর্ষের কোনওটিই ভাবতে পারি না)। ক্যাচ ব্লকের ক্ষেত্রে আপনার বৈধ পয়েন্ট থাকতে পারে, যেমন কোনও কিছু লগ করার জন্য একটি লাইন স্টেটমেন্ট তবে পাঠযোগ্যতার দিক থেকে এটি আরও অর্থবোধ করে (কমপক্ষে আমার কাছে) প্রয়োজন}}}

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.