try করে catch কর
কিছু কিছু কোড একটু রিস্কি হয়। মানে কোডের ভিতর ত্রুটি (Error) চলে আসতে পারে। আবার নাও আসতে পারে। যেমন ধর, JSON.parse ইউজ করবি। সে কিন্তু প্যারামিটার হিসেবে জেশন স্ট্রিং নিবে। এখন কোনো কারণে যদি JSON ডাটা ঠিকমতো না আসে বা রিটার্ন হিসেবে একটা স্ট্রিং দিয়ে দিছে, তখন কিন্তু এরর দিয়ে ফেলবে।
আর ডাটা লোড করতে এরর খেলে এরর হ্যান্ডেল করতে হয়, নচেৎ ওয়েবসাইট ক্রাশ করতে পারে। ঠিকমতো কাজ করবে না বা ভাঙাচোরা একটা ফিল দিতে পারে।
কেউ তো আর ইচ্ছা করে খারাপ কোড লিখে না বা এরর খাবে, এমন কোড লিখে না। তারপরেও কোডে এরর খায়। তার একটা বড় অংশ আসে ইউজারের ইনপুট বা আউটসাইডের ডাটার কারণে। সব সময় যে সব ডাটা সেইম স্টাইলে আসবে, এইটার 100% গ্যারান্টি সব সময় দেয়া যায় না। তাই কিছু কিছু বিশেষ কাজ করার সময় এক্সট্রা সেইফটি নিতে হয়।
আর এই এক্সট্রা সেইফটিকে বলে try-catch-finally । এই try-catch-finally-এর মধ্যে তিনটা কোডের ব্লক হতে পারে।
try ব্লক
এখানে তুই সেই কোড লিখবি, যেটাতে সমস্যা হতে পারে, আবার না-ও হতে পারে।
catch ব্লক
যদি try-এর ভিতরে কোডে কোনো সমস্যা হয়, কোনো এরর খায়, তাহলে সে catch ব্লকে আসবে। এই catch ব্লকে সাধারণত ইউজারকে এরর ম্যাসেজ দেখানো হয় বা যে জিনিসটার জন্য এরর খাইছে, সেটার একটা ডিফল্ট মান সেট করে দেয়া হয়।
finally ব্লক (অপশনাল)
এটা সবসময় রান করে। মানে এরর হোক বা না হোক, finally ব্লকের কোড শেষ পর্যন্ত চলবেই। যেমন ধর, তুই বই পড়স আর না পড়স, দিনশেষে বই ঠিকই বন্ধ করস। এমন একটা বিষয় আরকি।
এরর খেতে পারে, এমন একটা কোডের অংশ এখন দেখাই। যদি সার্ভার সাইড থেকে জেশন ডাটা আসে, তাহলে সেটাকে আরামসে parse করে ফেলতে পারবে।
const data = '{"name":"Rahim","age":25,"isStudent":true}'
const result = JSON.parse(data);
console.log(result);
output: {name: 'Rahim', age: 25, isStudent: true}তবে সব সময় যে ভদ্র জেশন ডাটা আসবে, সেটা নাও হতে পারে। কোনো কোনো সময় ডাটা দিতে গিয়ে ডাটা দিতে না পেরে হয়তো কোনো একটা নরমাল স্ট্রিং দিয়ে ফেলল। তাহলে তো জেশনের parse আর কাজ করবে না; বরং উল্টা এরর দিয়ে ফেলবে।
const data = 'Data stolen by data baba';
const result = JSON.parse(data);
console.log(result);
output: SyntaxError: Unexpected token 'D', "Data stole"... is not valid JSONএই ধরনের এরর ঠিকমতো হ্যান্ডেল না করলে ওয়েবসাইট ক্রাশ করে ফেলতে পারে অথবা ওয়েবসাইটের একটা অংশ ঠিকমতো নাও চলতে পারে। তখন try-catch finally-এর মতো সেইফটি ইউজ করতে হয়।
try {
const data = 'Data stolen by data baba';
const result = JSON.parse(data);
console.log(result);
} catch (error) {
console.log(`Error handled gracefully.`);
} finally {
console.log('JSON parsing attempt completed.');
}
Output:
Error handled gracefully.
JSON parsing attempt completed.try-catch-finally রিলেটেড আরেকটা উদাহরণ দেখে ফেলি। এইটা হচ্ছে, ফাইল থেকে কোনো কিছু পড়ার সময় এরর হতে পারে। অনেক সময় দেখা যায়, ফাইল অন্য কোনো এপ্লিকেশন খুলে রাখছে, তখন পড়তে পারে না। আর ফাইল ওপেন করতে না পারলে এরর দিবে। যে ফাইল ক্লোজ কর, নচেৎ আমি ফাইলের ভিতরের জিনিস পড়তে পারতেছি না। তবে ফাইল পড়তে পারুক বা এরর খাক না কেন, শেষ হলে ফাইল মাস্ট ক্লোজ করে ফেলতে হবে।
try {
console.log('Opening the file...');
// Read from file. May work or fail
} catch (error) {
console.error('Error:', error.message);
} finally {
console.log('Closing the file...');
}
Output:
Opening the file...
Closing the file...তবে সব সময় যে try-catch-finally তিনটা ব্লকই লিখতে হবে, এমন কোনো কথা নাই। প্রায় সময় দেখবি, শুধু try-catch লিখছে, ফাইনালি এর দরকার পড়ে নাই। তখন finally ব্লক লিখে না কেউ কেউ।
নিচের একটা ফাংশনে আমরা স্ট্রিংকে আপারকেইস করতে চাই। কেউ যদি স্ট্রিং আর্গুমেন্ট দিয়ে এই ফাংশনকে কল করে, তাহলে সে ঠিকমতো আউটপুট দিয়ে দিবে। আর কোনো কারণে স্ট্রিং না দিয়ে যদি কল বা অন্য কিছু দিয়ে কল করে, তাহলে catch-এর মধ্যে সেই এররকে ধরে ফেলতে পারবে। আর এইখানে শুধু try-catch ইউজ করা হইছে।
function getProperty(str) {
try {
return str.toUpperCase();
} catch (error) {
console.error('Error eaten by virus.');
}
}
console.log(getProperty('My Name is Korona'));
console.log(getProperty());
Output:
MY NAME IS KORONA
Error eaten by virus.আবার শুধু try-finally-ও হতে পারে। নিচের মতো করে—
function performanceCleanUp() {
try {
console.log('Starting a process...');
} finally {
console.log('Cleaning up resources...');
}
}
performanceCleanUp();
Output:
Starting a process...
Cleaning up resources...অনেক সময় error হওয়ার আগে আমরা চেক করে কনসোল লগ করে ফেলি। এইসব ক্ষেত্রে তুই চাইলে নিজেও একটা এরর বানিয়ে সেটাকে থ্রো করতে পারস। এইটাকে এরর থ্রো করা বলে।
function validateInput(input) {
try {
if (typeof input !== 'string') {
throw new Error('Input must be a string');
}
console.log('Valid input:', input);
} catch (error) {
if (error) {
console.error('Custom Error:', error.message);
} else {
console.error('Unknown Error:', error.message);
}
}
}
validateInput('Hello');
validateInput(42);
Output:
Valid input: Hello
Custom Error: Input must be a stringপ্রয়োজনীয় জায়গায় try-catch-finally লেখা অনেক ইম্পরট্যান্ট।
Practice:
- একটা কোড লিখ, যেখানে JSON.parse ব্যবহার করে ডাটা পার্স করার চেষ্টা করবি। ধর, JSON ডাটা হলো {product: 'Date', price: 450}। তবে সার্ভার কোনো সময় ভুল ডাটা পাঠাতে পারে, যেমন “Data corrupted” লিখে স্ট্রিং ডাটা পাঠিয়ে দিল। যদি এরর হয়, সেটা catch ব্লকে হ্যান্ডেল করবি এবং কনসোলে ম্যাসেজ দিবি "Invalid JSON format"।
- validateInput নামে একটা ফাংশন বানা, যেটা ইউজারের ইনপুট চেক করবে। ইনপুট হতে হবে email address (যেমন test@example.com)। ইনপুট ই-মেইলে যদি @ চিহ্ন না থাকে, তাহলে custom error দেখাবে "Invalid email format"।
- JSON.parse ব্যবহার করে এমন একটা কোড ব্লক লিখে ফেল, যেখানে try ব্লকে ধর {role: 'CEO', weeklyHours: 1000} ডাটা আসছে। যদি ডাটা পার্স করতে পারিস এবং এরর খায়। যেটাই হোক না কেন, কনসোলে দেখাবি "Week is over"।
- stringOnlyParser ফাংশনে চেক কর। ইনপুট null বা empty string বা undefined হলে বলবি "Input must be a String."।
- try-catch-finally ব্যবহার করে এমন একটা কোড বানা, যেখানে ইউজারের একাউন্ট ডিলিট করার সিমুলেশন হবে। try ব্লকে বলবি "Deleting account", catch ব্লকে বলবি "Failed to delete account", আর finally ব্লকে বলবি "Account deletion attempt finished"।
