`অবশেষে ওভাররাইড` চেষ্টা `এ কেন একটি রিটার্ন আসে?


100

কীভাবে চেষ্টা / ধরার ব্লক কাজ করে তার মধ্যে ফেরতের বিবৃতি দেয়?

function example() {
    try {
        return true;
    }
    finally {
        return false;
    }
}

আমি এই ফাংশনটির আউটপুট হবে আশা করছি true, তবে পরিবর্তে এটি হয় false!


অন্যদের জন্য, ক্যাচ ব্লকে রিটার্নটি মিথ্যা করুন, শেষ অবধি নয়।
হবিভাবানী

উত্তর:


95

সবশেষে সর্বদা মৃত্যুদণ্ড কার্যকর করা হয়। এটাই তার জন্য, যার অর্থ এটি আপনার ক্ষেত্রে ফিরে আসে।

আপনি আপনার কোডটি পরিবর্তন করতে চান তাই এটি আরও এরকম:

function example() { 
    var returnState = false; // initialisation value is really up to the design
    try { 
        returnState = true; 
    } 
    catch {
        returnState = false;
    }
    finally { 
        return returnState; 
    } 
} 

সাধারণভাবে বলতে গেলে আপনি কোনও ফাংশনে কখনই একাধিক রিটার্নের বিবৃতি রাখতে চান না, কারণ এরকম জিনিস।


47
আমি যুক্তি দেব যে একাধিক রিটার্নের স্টেটমেন্টটি সবসময় খারাপ হয় না - আরও আলোচনার জন্য দেখুন স্ট্যাকওভারফ্লো . com/ জিজ্ঞাসা / 703670০//২
কাস্ট্রোহেঞ্জ

4
আমিও এক রিটার্নের নিয়মের সাথে একমত নই। আপনার অবশেষে কখনই ফিরে আসা উচিত নয়, যদিও (সি # তে, এটি অনুমোদিতও নয়)।
এরিক্ক্যালেন

@ এরিক্কাল্লেন - এটি একটি ভাল বিষয়। টিসিএফ ব্লকের বাইরে
ফেরা

4
@ কাস্ট্রোহেঞ্জ - এটি কোনও কঠোর এবং দ্রুত নিয়ম নয়, তবে এই থ্রেডের বেশিরভাগ কপুন্টার-উদাহরণগুলি বেশ সংকীর্ণ এবং আমি দেখতে পাই এমন একমাত্র বৈধ ঘটনা "গার্ড ক্লজ" (মূলত শীর্ষে ইনপুট ডেটা পরীক্ষার প্যাটার্ন) ফাংশন এবং শর্তাধীন ফিরে আসা)। এটি একটি পুরোপুরি বৈধ কেস, তবে সত্যই সেই রিটার্নগুলি ব্যতিক্রম হওয়া উচিত (আবার শক্ত এবং দ্রুত নয়)।
অনাকাটা

4
আসলে আই 6 এবং আই 7 এ, অবশেষে একটি দুর্দান্ত গুরুতর ব্রাউজার বাগের কারণে সব ক্ষেত্রে সর্বদা কার্যকর করা হয় না। বিশেষত - যদি একটি ব্যতিক্রম এমন একটি চেষ্টা-অবরুদ্ধ ব্লকে ছুঁড়ে ফেলা হয় যা উচ্চ স্তরের চেষ্টা-ধরা দ্বারা ঘিরে থাকে না, তবে অবশেষে ব্লকটি কার্যকর হবে না। এখানে একটি পরীক্ষার মামলা jsfiddle.net/niallsmart/aFjKq । এই ইস্যুটি IE8 এ স্থির করা হয়েছিল।
নিয়াল স্মার্ট

44

ইসিএমএ -২2২ অনুসারে (৫ ই ডিসেম্বর, ২০০৯ ডিসেম্বর) পিপি ৯৯ তে:

উত্পাদন TryStatement : try Block Finallyনিম্নলিখিত হিসাবে মূল্যায়ন করা হয়:

  1. বিটিকে ব্লকের মূল্যায়নের ফলাফল হতে দিন।
  2. চূড়ান্তভাবে মূল্যায়নের ফলাফল হতে হবে এফ।
  3. যদি এফ.টিপ স্বাভাবিক থাকে তবে বি।
  4. রিটার্ন এফ।

এবং পৃষ্ঠা থেকে 36:

সম্পূর্ণতা টাইপ বিবৃতি আচরণ (ব্যাখ্যা করতে ব্যবহৃত হয় break, continue, returnএবং throw) যে নিয়ন্ত্রণের nonlocal স্থানান্তর সঞ্চালন। সম্পূর্ণতা ধরনের মানগুলি ফর্মের triples হয় (টাইপ, মান, লক্ষ্য) , যেখানে টাইপ এক normal, break, continue, return, অথবা throw, মান কোন ECMAScript প্রোগ্রামিং ভাষা মান বা খালি, এবং লক্ষ্য কোনো নাম ECMAScript আইডেন্টিফায়ার বা ফাঁকা রয়েছে।

এটি পরিস্কার যে শেষ অবধি রিটার্ন হিসাবে return falseসমাপ্তির ধরণ সেট করবে , যা 4 করার কারণ ।try ... finally


4
এই প্রশ্নের "মূলত সঠিক তবে কোনওভাবে স্কুইশি এবং অ-স্পষ্টকরণ" উত্তরগুলি সব ধরণের পড়ার পরে, এইটি আসলে তা উপলব্ধি করেছে। মূল বিটিটিটি হ'ল চেষ্টা + ক্যাচ (যা ফিরতে বা নিক্ষেপ করা বা কেবল স্বাভাবিক প্রবাহ) এর শেষে যা কিছু ঘটেছিল তা মনে রাখা হয় যখন এটি শেষ অংশটি চালায় এবং তারপরে আসলে শেষ হয় কেবল শেষ পর্যন্ত কিছু না ঘটে।
প্রিভেন্টরেজ

14

আপনি যখন ব্যবহার করবেন finally, পদ্ধতিটি প্রস্থান হওয়ার আগে সেই ব্লকের মধ্যে থাকা কোনও কোড আগুনে। কারণ আপনি একটি ফিরতি ব্যবহার করছেন finallyব্লক, এটা কল return falseএবং পূর্ববর্তী অগ্রাহ্য return trueমধ্যে tryব্লক।

(পরিভাষাটি সম্ভবত সঠিক না হতে পারে))


4

পরিশেষে অবরুদ্ধ ব্লক রাইটারাইটগুলি ব্লক রিটার্ন চেষ্টা করে (আলংকারিকভাবে বলতে হয়)।

কেবল উল্লেখ করতে চেয়েছিলাম, আপনি যদি শেষ থেকে কিছু ফিরিয়ে দেন তবে তা ফাংশন থেকে ফিরে আসবে। তবে শেষ পর্যন্ত যদি কোনও 'রিটার্ন' শব্দ না থাকে - এটি চেষ্টা ব্লক থেকে মান ফিরিয়ে দেওয়া হবে;

function example() {
    try {
        return true;
    }
    finally {
       console.log('finally')
    }
}
console.log(example());
// -> finally
// -> true

সুতরাং-পরিশেষে- -চেষ্টার রিটার্ন returnপুনর্লিখন করে return


3

আপনি কেন মিথ্যা হয়ে যাচ্ছেন তা আপনি শেষ অবধি ফিরে এসেছেন। অবশেষে ব্লকটি সর্বদা কার্যকর করা উচিত। যাতে আপনার return trueপরিবর্তনreturn false

function example() {
    try {
        return true;
    }
    catch {
        return false;
    }
}

1

যতদূর আমি জানি, finallyব্লকটি সর্বদা কার্যকর করে, আপনার returnভিতরে কোনও বিবৃতি আছে কিনা তা নির্বিশেষে try। তবে, আপনি returnঅবশেষে ব্লকের ভিতরে স্টেটমেন্ট দিয়ে ফিরে আসা মান পাবেন ।

আমি এটি উবুন্টুতে ফায়ারফক্স 3.6.10 এবং ক্রোম 6.0.472.63 উভয় দিয়ে পরীক্ষা করেছি। এই কোডটি অন্য ব্রাউজারগুলিতে আলাদা আচরণ করতে পারে।


1

একটি অবশেষে-ব্লক থেকে ফিরে

যদি finally-ব্লক কোনও মান ফেরত দেয় তবে, এবং- ব্লকের try-catch-finallyকোনও returnবিবৃতি নির্বিশেষে এই মানটি পুরো বিবৃতিটির রিটার্ন মান হয়ে যায়trycatch

তথ্যসূত্র: বিকাশকারী.মোজিলা.অর্গ


1

আমি এখানে কিছুটা আলাদা উত্তর দেব: হ্যাঁ, উভয় tryএবং finallyব্লক উভয়ই কার্যকর করা finallyহয় এবং কোনও ফাংশনের আসল "রিটার্ন" মানের চেয়ে বেশি অগ্রাধিকার গ্রহণ করে। তবে, এই কোডগুলি সর্বদা আপনার কোডগুলিতে ব্যবহার হয় না।

কারণটা এখানে:

  • নীচের উদাহরণটি res.send()এক্সপ্রেস.জেএস থেকে ব্যবহার করবে , যা একটি HTTP প্রতিক্রিয়া তৈরি করে এবং প্রেরণ করে।
  • আপনার tryএবং finallyব্লক উভয়ই এইভাবে এই ফাংশনটি কার্যকর করবে:
try {
    // Get DB records etc.
    return res.send('try');
} catch(e) {
    // log errors
} finally {
    return res.send('finally');
}

এই কোডটি tryআপনার ব্রাউজারে স্ট্রিংটি প্রদর্শন করবে । এছাড়াও, উদাহরণটি আপনার কনসোলটিতে ত্রুটি প্রদর্শন করবে। res.send()ফাংশন বলা হয় দুইবার । এটি কোনও ক্রিয়াকলাপের সাথে ঘটবে। চেষ্টা-অবশেষে অবরুদ্ধ অবরোধ এই প্রশিক্ষণকে প্রশিক্ষণহীন চোখে আবদ্ধ করবে, কারণ (ব্যক্তিগতভাবে) আমি কেবল returnফাংশন-স্কোপের সাথে মানগুলি সংযুক্ত করি ।

ইমো আপনার সেরা বাজি হ'ল কোনও ব্লকের ভিতরে কখনও ব্যবহারreturnfinally করা নয় । এটি আপনার কোডকে ছাপিয়ে যাবে এবং সম্ভাব্য ত্রুটিগুলি মাস্ক করবে।

আসলে, পিএইচপিএসটারমে একটি ডিফল্ট কোড পরিদর্শন নিয়ম সেট আপ আছে যা এর জন্য "সতর্কতা" দেয়:

https://www.jetbrains.com/help/phpstorm/javascript-and-typescript-return-inside-finally- block.html

সুতরাং আপনি কি finallyজন্য ব্যবহার করবেন?

আমি finallyকেবল পরিষ্কার-করা স্টাফ ব্যবহার করতে চাই। যে কোনও কিছু যা কোনও ফাংশনের ফেরতের মূল্যের জন্য সমালোচনা নয়।

আপনি যদি এটি সম্পর্কে চিন্তা করেন তবে এটি বোধগম্য হতে পারে, কারণ আপনি যখন কোডের নীচে একটি লাইন উপর নির্ভর করেন তখন আপনি finallyধরে নিচ্ছেন যে এতে tryবা ত্রুটি হতে পারে catch। তবে শেষ 2 টি ত্রুটি পরিচালনার প্রকৃত বিল্ডিং ব্লক। শুধু একটি ব্যবহার returnমধ্যে tryএবং catchপরিবর্তে।


-2

অবশেষে সর্বদা চেষ্টা ধরার ব্লকের শেষে চালানো উচিত, যাতে (স্পেসিফিকেশন দ্বারা) আপনি কেন মিথ্যা ফেরত পাচ্ছেন। মনে রাখবেন যে সম্পূর্ণরূপে সম্ভব যে বিভিন্ন ব্রাউজারের বিভিন্ন প্রয়োগ রয়েছে।


আইই 8, ফায়ারফক্স 3.6 এবং ক্রোম 6: সব একই;)
Bonfo

-3

এই সম্পর্কে কি?

doubleReturn();

function doubleReturn() {
  let sex = 'boy';

  try {
    return sex;

    console.log('this never gets called...');
  } catch (e) {} finally {
    sex = 'girl'; 

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