কীভাবে চেষ্টা / ধরার ব্লক কাজ করে তার মধ্যে ফেরতের বিবৃতি দেয়?
function example() {
try {
return true;
}
finally {
return false;
}
}
আমি এই ফাংশনটির আউটপুট হবে আশা করছি true, তবে পরিবর্তে এটি হয় false!
উত্তর:
সবশেষে সর্বদা মৃত্যুদণ্ড কার্যকর করা হয়। এটাই তার জন্য, যার অর্থ এটি আপনার ক্ষেত্রে ফিরে আসে।
আপনি আপনার কোডটি পরিবর্তন করতে চান তাই এটি আরও এরকম:
function example() {
var returnState = false; // initialisation value is really up to the design
try {
returnState = true;
}
catch {
returnState = false;
}
finally {
return returnState;
}
}
সাধারণভাবে বলতে গেলে আপনি কোনও ফাংশনে কখনই একাধিক রিটার্নের বিবৃতি রাখতে চান না, কারণ এরকম জিনিস।
ইসিএমএ -২2২ অনুসারে (৫ ই ডিসেম্বর, ২০০৯ ডিসেম্বর) পিপি ৯৯ তে:
উত্পাদন
TryStatement : try Block Finallyনিম্নলিখিত হিসাবে মূল্যায়ন করা হয়:
- বিটিকে ব্লকের মূল্যায়নের ফলাফল হতে দিন।
- চূড়ান্তভাবে মূল্যায়নের ফলাফল হতে হবে এফ।
- যদি এফ.টিপ স্বাভাবিক থাকে তবে বি।
- রিটার্ন এফ।
এবং পৃষ্ঠা থেকে 36:
সম্পূর্ণতা টাইপ বিবৃতি আচরণ (ব্যাখ্যা করতে ব্যবহৃত হয়
break,continue,returnএবংthrow) যে নিয়ন্ত্রণের nonlocal স্থানান্তর সঞ্চালন। সম্পূর্ণতা ধরনের মানগুলি ফর্মের triples হয় (টাইপ, মান, লক্ষ্য) , যেখানে টাইপ একnormal,break,continue,return, অথবাthrow, মান কোন ECMAScript প্রোগ্রামিং ভাষা মান বা খালি, এবং লক্ষ্য কোনো নাম ECMAScript আইডেন্টিফায়ার বা ফাঁকা রয়েছে।
এটি পরিস্কার যে শেষ অবধি রিটার্ন হিসাবে return falseসমাপ্তির ধরণ সেট করবে , যা 4 করার কারণ ।try ... finally
পরিশেষে অবরুদ্ধ ব্লক রাইটারাইটগুলি ব্লক রিটার্ন চেষ্টা করে (আলংকারিকভাবে বলতে হয়)।
কেবল উল্লেখ করতে চেয়েছিলাম, আপনি যদি শেষ থেকে কিছু ফিরিয়ে দেন তবে তা ফাংশন থেকে ফিরে আসবে। তবে শেষ পর্যন্ত যদি কোনও 'রিটার্ন' শব্দ না থাকে - এটি চেষ্টা ব্লক থেকে মান ফিরিয়ে দেওয়া হবে;
function example() {
try {
return true;
}
finally {
console.log('finally')
}
}
console.log(example());
// -> finally
// -> true
সুতরাং-পরিশেষে- -চেষ্টার রিটার্ন returnপুনর্লিখন করে return।
আপনি কেন মিথ্যা হয়ে যাচ্ছেন তা আপনি শেষ অবধি ফিরে এসেছেন। অবশেষে ব্লকটি সর্বদা কার্যকর করা উচিত। যাতে আপনার return trueপরিবর্তনreturn false
function example() {
try {
return true;
}
catch {
return false;
}
}
যতদূর আমি জানি, finallyব্লকটি সর্বদা কার্যকর করে, আপনার returnভিতরে কোনও বিবৃতি আছে কিনা তা নির্বিশেষে try। তবে, আপনি returnঅবশেষে ব্লকের ভিতরে স্টেটমেন্ট দিয়ে ফিরে আসা মান পাবেন ।
আমি এটি উবুন্টুতে ফায়ারফক্স 3.6.10 এবং ক্রোম 6.0.472.63 উভয় দিয়ে পরীক্ষা করেছি। এই কোডটি অন্য ব্রাউজারগুলিতে আলাদা আচরণ করতে পারে।
একটি অবশেষে-ব্লক থেকে ফিরে
যদি
finally-ব্লক কোনও মান ফেরত দেয় তবে, এবং- ব্লকেরtry-catch-finallyকোনওreturnবিবৃতি নির্বিশেষে এই মানটি পুরো বিবৃতিটির রিটার্ন মান হয়ে যায়trycatch
তথ্যসূত্র: বিকাশকারী.মোজিলা.অর্গ
আমি এখানে কিছুটা আলাদা উত্তর দেব: হ্যাঁ, উভয় 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পরিবর্তে।
এই সম্পর্কে কি?
doubleReturn();
function doubleReturn() {
let sex = 'boy';
try {
return sex;
console.log('this never gets called...');
} catch (e) {} finally {
sex = 'girl';
alert(sex);
}
}