6.4 জাভাস্ক্রিপ্টের এরর কিভাবে থ্রোও করব

 

ট্রাই-ক্যাচ ব্লক নিয়ে কাজ করতে হলে প্রথমে এরর থ্রো করা শিখতে হবে। জাভাস্ক্রিপ্টে কিভাবে এরর থ্রো করতে হয় এটা নিয়ে আলোচনার আগে আমাদের বোঝা উচিত যে এখানে ‘এরর থ্রো’ করা বলতে আসলে কি বোঝানো হচ্ছে। কোনো প্রোগ্রামিং ল্যাংগুয়েজ যখন এমন একটি কিছুর মুখোমুখি হয় যেটাকে সে আর প্রসেস করতে পারছেনা, তখন ল্যংগুয়েজ-টি আমাদের-কে একটি ‘এরর’ পাঠিয়ে জানান দেয়। এরর থ্রো করা বলতে আসলে আমরা এই ব্যাপারটিকেই বুঝি। সাধারণত এরর থ্রো করার এই কাজটি ইঞ্জিনকে করতে হয়। কিন্তু আমরা ডেভেলপার-রাও কিন্তু চাইলে নিজেদের ইচ্ছেমতো এরর বানিয়ে সেটিকে থ্রো করতে পারি। ট্রাই-ক্যাচ-ফাইনালি ব্লক নিয়ে কাজ করার সময় আমরা নিজ থেকে এরর থ্রো করে ক্যাচ ব্লকে সেটা ধরতে পারি। এই কাজটি করার জন্য জাভাস্ক্রিপ্ট আমাদের “throw” স্টেটমেন্ট দিয়েছে।
এবার একটি সহজ উদাহরণ দেখা যাকঃ

var input = 25;
try {
   if (input < 10) {
     throw 'too small!';
   } else if (input > 20) {
     throw 'too big!';
   } else {
     console.log('Input was ' + input);
   }
} catch (error) {
   console.log('Input was ' + error);
} finally {
   console.log('Inside finally block!')
}

// Output: Input was too big!
// Inside finally block!

 

এখানে ট্রাই ব্লকে ইফ এলস স্টেটমেন্টের সাহায্যে দেখা হচ্ছে যে input এর মানটি ১০ এর চেয়ে ছোট কিনা। ছোট হলে too small লিখে একটি স্ট্রিং থ্রো করা হয়েছে এবং মান ২০ এর চেয়ে বেশি হলে too big লিখে একটি স্ট্রিং থ্রো করা হয়েছে। এখন প্রশ্ন হলো এই থ্রো করা স্ট্রিং দিয়ে কি লাভ আমাদের। এখানেই আসে ক্যাচ ব্লকের কাজ। থ্রো করার পরবর্তীতে ক্যাচ ব্লকে এসে ওই স্ট্রিং গুলো একেকটা এরর অবজেক্ট হিসেবে ধরা দিচ্ছে। এই error টিই কিন্তু আমাদের ট্রাই ব্লক থেকে থ্রো করা হয়েছিলো। অর্থাৎ থ্রো স্টেটমেন্ট ব্যবহার করার কারনে নতুন একটি এরর অবজেক্ট তৈরি হয়েছে।

এখানে লক্ষনীয় ব্যপারটি হলো জাভাস্ক্রিপ্ট ইঞ্জিন কিছু না বলা সত্ত্বেও আমরা ডেভেলপার-রা আমাদের প্রোগ্রামের প্রয়োজন অনুযায়ী এরর বানিয়ে থ্রো করলাম এবং এরর পাওয়া গেলে প্রোগ্রাম কি আচরণ করবে সেই ব্যবস্থা আগে থেকেই করে রাখলাম। এই প্রোগ্রামটি রান করলে যে এরর টি কনসোলে প্রিন্ট হবে সেটি হলো too big কারণ input এর মান এখানে ২০ এর চেয়ে বড়। এবং সবশেষে কনসোলে ফাইনালি ব্লকের লেখাটি প্রিন্ট হবে।
আশা করছি ট্রাই-ক্যাচ-ফাইনালি ব্লক নিয়ে সবার এখন ভালো ধারনা হয়েছে এবং এখন থেকে আমরা  সবাই জাভাস্ক্রিপ্টে যেকোনো ধরনের এরর হ্যান্ডেল করে ফেলতে পারবো।

 

  • Error Handling Examples
  • Error Handling Practices
  • Error Handling Interview Questions
উদাহরন
  • উদাহরন ১ঃ
    function div(a, b) {
      try {
        if (b <= 0) {
          throw new Error("Cannot divided by zero");
        } else {
          console.log(a / b);
        }
      } catch (error) {
        console.log(error.message);
      }
    }
    
    div(1, 1);

    আমরা জানি কোন সংখ্যাকে যদি শূন্য দ্বারা ভাগ করা হয় তবে তার ভাগফল অসজ্ঞায়িত হয়। তাই আমরা চেক করে নিয়েছি আমাদের সংখ্যাটি কি শূণ্য কিনা যদি শূণ্য হয় তবে আমরা একটি এরর থ্রো করেছি যা আমরা catch এ এক্সেস করতে পারবো।

  • উদাহরন ২ঃ
    function getRectArea(width, height) {
      if (isNaN(width) || isNaN(height)) {
        throw "Parameter is not a number!";
      }
    }
    
    try {
      getRectArea(3, "A");
    } catch (e) {
      console.error(e);
      // expected output: "Parameter is not a number!"
    }

    উপরের getRectArea() ফাংশনটিতে প্যারামিটার হিসেবে width, height পাঠানো হয়েছে যা দুইটিই integer হওয়ার কথা কিন্তু আমরা একটি প্যারমিটার হিসেবে স্ট্রিং পাঠানো হয়েছে এতে আমরা আয়তক্ষেত্রটি পাবো না সেজন্য আমরা চেক করছি প্যারামিটার দুইটি Integer কিনা যদি Integer না হয় সেক্ষেত্রে আমরা একটি এরর থ্রো করছি এবং এররটি 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 {
          throw new Error("Failed to load Data");
        }
      } catch (error) {
        console.error(error);
        console.error("Server Error");
      }
    }
    
    getData();

    উপরের আমরা একটি asynchronous কল করা হয়েছে ,যদি মেথডটির স্ট্যাটাস ২০০ হয় তবে success হবে আর যদি না হয় তবে আমরা একটি এরর থ্রো করছি – “Failed to load Data” এবং catch এ আমরা তা এক্সেস করতে পারতেছি।

  • উদাহরন ৪ঃ
    async function getData() {
      try {
        const response = await fetch(
          "https://jsonplaceholder.typicode.com/todos/1"
        );
    
        if (response.status === 200) {
          const result = await response.json();
    
          const id = result.userId;
          const albumsRes = await fetch(
            `https://jsonplaceholder.typicode.com/albums?userId=${id}`
          );
          if (albumsRes.status === 200) {
            const albums = await albumsRes.json();
            console.log(albums);
          } else {
            throw new Error("Failed to load albums data");
          }
        } else {
          throw new Error("Failed to load Todo data");
        }
      } catch (error) {
        console.log(error.message);
        console.log("Server Error");
      }
    }
    
    getData();

    উপরে দুইটি asynchronous API কল করা হচ্ছে প্রথম কলের userId পেলে পরের API টি কল হচ্ছে এখন ধরুন যেকোন একটি API কলে এরর দিচ্ছে আমরা কিভাবে জানবো ? এর জন্য আমরা এরর throw করতে পারি যাতে আমরা নির্দিষ্টভাবে কোথায় এরর হচ্ছে সেটি ধরতে পারি।

  • উদাহরন ৫ঃ
    try {
      throw 52; // throws an exception with a numeric value
    } catch (e) {
      if (e <= 50) {
        // statements to handle exceptions 1-50
      } else {
        // cannot handle this exception, so rethrow
        throw e;
      }
    }

    আমরা চাইলে একটি exception কে ReThrow করতে পারি।

এসো নিজে করি
  • একটি ফাংশন প্যারামিটার হিসেবে একটি integer নেয় , এবং
    1. যদি খালি প্যারামিটার হয় তবে ইরর দিবে is Empty
    2. যদি Not a Number হয় তবে ইরর দিবে not a number ,
    3. যদি ১০ এর থেকে বড় হয় তবে ইরর দিবে too high
    4. যদি ৫ এর নিচে হয় তবে এরর দিবে too low
    5. যদি ৫-১০ এর মধ্যে হয় তবে return দিবে Perfect match
  • একটি API কল করতে হবে যদি success হয় তবে success ম্যাসেজ দেখাতে হবে আর যদি success না হয় তবে Failed to load data দেখাতে হবে এবং যদি success হয় কিন্তু কোন ডাটা না থাকে তবে Empty Data দেখাতে হবে।