6.3 Try-Catch-Finally দিয়ে এরর হ্যান্ডলিং

 
জাভাস্ক্রিপ্ট এ “এরর হ্যান্ডেলিং” এর জন্য আমরা ট্রাই-ক্যাচ-ফাইনালি ব্লক ব্যবহার করি। এটি প্রকৃতপক্ষে একটি এক্সেপশন হ্যান্ডেলিং এর একটি রাস্তা। প্রথমে আসুন এই ব্লকগুলোর কাজ সম্পর্কে কিছু প্রাথমিক ধারনা নিয়ে নেই।

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

ক্যাচ ব্লকঃ  ট্রাই ব্লকের কোডে কোনো এরর পাওয়া গেলে সেটাকে আমরা কিভাবে হ্যান্ডেল করবো এই সম্পর্কিত সব কোড আমরা ক্যাচ ব্লকে লিখবো। অর্থাৎ ট্রাই ব্লক থেকে থ্রো করা এরর ক্যাচ করে আমরা এখানে পরবর্তী কাজ করবো।

ফাইনালি ব্লকঃ মনে রাখতে হবে যে ফাইনালি ব্লকের কোড সবসময় ট্রাই-ক্যাচ ব্লকের পরে রান করবে। আমরা যদি এমন কিছু করতে চাই যেই কাজটা প্রতিবার ট্রাই-ক্যাচ ব্লকের পরে হওয়া প্রয়োজন তাহলে সেটার জন্য ফাইনালি ব্লক ব্যবহার করতে পারি।

উপরের তিনটি ব্লকের মধ্যে ক্যাচ এবং ফাইনালি ব্লক দুটি কিন্তু অপশনাল অথবা ঐচ্ছিক। অর্থাৎ ট্রাই ব্লকটির সাথে ক্যাচ এবং ফাইনালি ব্লক দুইটি লিখতেই হবে এমন কোনো বাধ্যবাধকতা নেই। এই ব্লক দুটি আমরা আমাদের প্রয়োজন অনুযায়ী ব্যবহার করতে পারবো।

try {
    // কোনো ধরনের এক্সেপশন থ্রো হওয়ার আগ পর্যন্ত এই ব্লকের কোড রান করতে থাকবে
} catch {
   // ট্রাই ব্লক থেকে কোনো এক্সেপশন থ্রো হলে এই ব্লকের কোড রান করবে
} finally {
// এক্সেপশন থ্রো হোক অথবা না হোক, ট্রাই এবং ক্যাচ ব্লকের পরেই এই ব্লকের কোড রান করবে
}

 

একটি প্রোগ্রামে বিভিন্ন ধরনের এরর আসাই স্বাভাবিক। এই ব্লকগুলো ব্যবহারের সুবিধা হলো কোনো এরর ধরা পড়লে সেটির জন্য আমাদের প্রোগ্রাম যাতে বন্ধ না হয়ে যায় এটা নিশ্চিত করা। ট্রাই ক্যাচ ব্লক ব্যবহার করে আমরা বিভিন্ন ধরনের এরর এর জন্য আমাদের প্রোগ্রাম কিরকম আচরণ করবে সেটা বলে দিতে পারি। নিচের ফ্লোচার্ট-টি দেখলে আপনারা এসম্পর্কে আরো পরিষ্কার ধারনা পাবেন।

javascript try catch finally

চিত্রঃ ট্রাই-ক্যাচ-ফাইনালি ব্লক

 

উদাহরন
  • উদাহরন ১ঃ
    try {
      JSON.parse("<html></html>");
    } catch (e) {
      if (e instanceof SyntaxError) {
        console.log("I caught a SyntaxError! I'll handle it specifically here.");
      } else {
        console.log(
          "I caught an error, but it wasn't a SyntaxError. I handle all non-SyntaxErrors here."
        );
      }
    }

    উপরের কোডটিতে SyntaxError আছে, এই ইরর হ্যান্ডেল করার জন্য আমরা try catch ইউস করতে পারি। যদি try এর ভিতরে কোন ইরর দেয় ,সেই ইরর catch এর ভিতরে ধরা হয়। catch প্যারামিটার হিসেবে একটি error রিটার্ন করে ,সেই error কে আমরা নিজেদের মতো মডিফাই করতে পারি।

  • উদাহরন ২ঃ
    try {
      console.log(a);
    } catch (error) {
      console.log("An error caught");
      console.log("Error message: " + error);
    }

    আমরা যদি কোন ভ্যারিয়েবল ডিক্লেয়ার না করি তবে ইরর দেয়। উপরের কোডটিতে আমরা সেটি try/catch এর মাধ্যমে হ্যান্ডেল করলাম।

  • উদাহরন ৩ঃ
    try {
      nonExistentFunction();
    } catch (error) {
      console.error(error);
      // expected output: ReferenceError: nonExistentFunction is not defined
      // Note - error messages will vary depending on browser
    }

    উপরে nonExistentFunction() ফাংশনটি ডিক্লেয়ার করা হয়নি ,এখানে রেফারেন্স ইরর দিবে কিন্তু আমরা try/catch এর মাধ্যমে এই ইরর হ্যান্ডেল করতে পারি।

  • উদাহরন ৪ঃ
    async function getData() {
      try {
        const response = await fetch(
          "https://jsonplaceholder.typicode.com/todos/1"
        );
    
        if (response.status === 200) {
          const result = await response.json();
          console.log(result);
        } else {
          console.log("Failed to load Data");
        }
      } catch (error) {
        console.log("Server Error", error);
      }
    }
    
    getData();

    যখন কোন Api ইউজ করা হয় তখন বিভিন্ন ধরণের ইরর আসতে পারে যেমন authentication , server error এই ইররের জন্য এপলিকেশন destroy হয়ে যেতে পারে । try/catch ব্লক ব্যবহার করে আমরা বিভিন্ন ধরনের এরর এর জন্য আমাদের প্রোগ্রাম কিরকম আচরণ করবে সেটা বলে দিতে পারি।

  • উদাহরন ৫ঃ
    try {
      console.log("success");
    } catch (error) {
      console.log("There is a error");
    } finally {
      console.log("Always calling");
    }

    Finally সবসময়ই কল হবে এটি এরর হোক আর সাক্সেস হোক।যদি আমাদের এমন কোন কাজ থাকে যে কাজটি প্রতিবারই এক্সিকিউশন হবে success/error কোন বিষয় না, সেক্ষেত্রে আমরা finally ইউজ করবো।

এসো নিজে করি
  • finally কি সবসময়ই কল হয় ?
  • শুধু কি try লেখা যায় catch/finally ছাড়া ?
  • একটি asynchronous ফাংশনে API কল করে ,যদি status Code ২০০ হয় তবে ডাটা কনসোলে দেখাতে হবে এবং তা try catch দিয়ে এরর হ্যান্ডেলিং করতে হবে।