ExpressJs

⌘K
  1. Home
  2. Docs
  3. ExpressJs
  4. কোড reusable করা...
  5. (কাস্টম Error ক্লাস)

(কাস্টম Error ক্লাস)

(সাধারণ Error ব্যবহার)

ধরি আপনি একটি সাধারণ Error ক্লাস ব্যবহার করছেন। এটি কিছুটা সহজ, কিন্তু এর সাথে কিছু সীমাবদ্ধতা রয়েছে।

উদাহরণ: সাধারণ Error ক্লাস ব্যবহার

class UserService {
  getUserById(id) {
    const user = null;  // ধরুন ইউজারটি পাওয়া যায়নি
    if (!user) {
      throw new Error("User not found");
    }
    return user;
  }
}

try {
  const user = new UserService().getUserById(1);
} catch (err) {
  console.log(err.message);  // "User not found"
}

সমস্যা:

  1. স্ট্যাটাস কোড নেই: সাধারণ Error ক্লাসে HTTP স্ট্যাটাস কোড (যেমন 404, 500) ধারণ করার কোনো সুযোগ নেই। এতে করে আপনি যখন HTTP রেসপন্স পাঠাবেন, তখন স্ট্যাটাস কোড সঠিকভাবে সেট করতে পারবেন না।
  2. কাস্টম ডেটা বা প্রপার্টি নেই: Error ক্লাস শুধু message এবং stack ধারণ করতে পারে। এখানে statusCode বা isOperational নামের প্রপার্টি থাকা সম্ভব নয়, যা আমাদের জন্য অনেক গুরুত্বপূর্ণ হতে পারে।
  3. সংগঠিত কোড নয়: যদি কোডে অনেক জায়গায় একের পর এক একই ধরনের ত্রুটি (যেমন 404 User Not Found) ঘটতে থাকে, তবে সব জায়গায় একই লজিক লিখতে হবে, যা কোডকে অনিয়মিত এবং অগোছালো করে তুলবে।

2. ApiError ব্যবহার করলে (কাস্টম Error ক্লাস)

এখন যদি আপনি একটি কাস্টম ApiError ক্লাস ব্যবহার করেন, তবে এর মাধ্যমে ত্রুটি হ্যান্ডলিং অনেক বেশি সংগঠিত এবং উপকারী হবে।

উদাহরণ: ApiError ব্যবহার

class ApiError extends Error {
  constructor(statusCode, message, isOperational = true, stack = "") {
    super(message);
    this.statusCode = statusCode;
    this.isOperational = isOperational;
    if (stack) {
      this.stack = stack;
    } else {
      Error.captureStackTrace(this, this.constructor);
    }
  }
}

// ব্যবহার
class UserService {
  getUserById(id) {
    const user = null;  // ধরুন ইউজারটি পাওয়া যায়নি
    if (!user) {
      throw new ApiError(404, "User not found");
    }
    return user;
  }
}

try {
  const user = new UserService().getUserById(1);
} catch (err) {
  if (err instanceof ApiError) {
    console.log(`Error: ${err.message}, Status Code: ${err.statusCode}`);
  } else {
    console.log("Unknown error occurred");
  }
}

উপকারিতা:

  1. স্ট্যাটাস কোড অন্তর্ভুক্ত:
    • ApiError ক্লাসে আপনি statusCode প্রপার্টি যুক্ত করতে পারেন, যা HTTP রেসপন্সে স্ট্যাটাস কোড পাঠানোর সময় ব্যবহার করতে পারবেন।
    • যেমন, যদি ইউজার না পাওয়া যায়, তাহলে 404 কোডের সাথে "User not found" মেসেজ ফেরত দেওয়া যাবে।
    • এর ফলে আপনি বিশ্বস্ত HTTP রেসপন্স প্রদান করতে পারবেন, যা ক্লায়েন্টের জন্য আরো নির্দিষ্ট এবং মানসম্পন্ন হবে।
  2. কাস্টম ডেটা অন্তর্ভুক্ত:
    • ApiError ক্লাসের মাধ্যমে আপনি শুধু message নয়, আরো অনেক কাস্টম ডেটা অন্তর্ভুক্ত করতে পারেন, যেমন:
      • statusCode: HTTP স্ট্যাটাস কোড
      • isOperational: এটি নির্ধারণ করে যে, ত্রুটিটি অপারেশনাল (ব্যবহারকারী দ্বারা সংঘটিত) নাকি প্রোগ্রামিং এরর।
      • stack: স্ট্যাক ট্রেস, যা ডিবাগিং বা লগিংয়ের জন্য সহায়ক।
    • এর ফলে আপনি বেশি নিয়ন্ত্রণ পেতে পারেন আপনার অ্যাপ্লিকেশনের ত্রুটি প্রসেসিংয়ে।
  3. সংগঠিত কোড:
    • যখন আপনি একাধিক জায়গায় একই ধরণের ত্রুটি হ্যান্ডলিং করতে চান, তখন কাস্টম ApiError ব্যবহার করলে কোডটি অনেক বেশি সংগঠিত এবং পুনঃব্যবহারযোগ্য হয়।
    • উদাহরণস্বরূপ, আপনি যখন ইউজার না পাওয়া বা সিস্টেম ত্রুটি মোকাবেলা করবেন, তখন একই ApiError ক্লাস ব্যবহার করে সমস্ত জায়গায় কোডটিকে এককভাবে পরিচালনা করতে পারবেন।
  4. কাস্টম এরর ক্লাসের ব্যবহার:
    • আপনি ApiError ক্লাসটি অন্য কোনও কাস্টম এররের জন্যও ব্যবহার করতে পারবেন। যেমন, ডাটাবেসের সংযোগ ত্রুটি, ইনপুট ভ্যালিডেশন ত্রুটি ইত্যাদি।
    • এই কাস্টম ক্লাসগুলো যখন এক জায়গায় থাকে, তখন তাদের ডিবাগিং এবং হ্যান্ডলিং আরও সহজ হয়ে ওঠে।

অন্য কিছু সুবিধা:

  • ডিবাগিংয়ের সুবিধা: ApiError ক্লাসে স্ট্যাক ট্রেস রাখা হবে, যা কোনো ত্রুটি ঘটলে কীভাবে সেই ত্রুটি সৃষ্টি হয়েছে, তা জানাতে সাহায্য করবে। Error.captureStackTrace ব্যবহারের ফলে আপনি সহজেই ত্রুটির উৎস ট্র্যাক করতে পারবেন।
  • সঠিক এরর ম্যাসেজ: এরর ম্যাসেজের সাথে আপনি HTTP স্ট্যাটাস কোড, কি ধরনের এরর (যেমন: Operational বা Programming) তা সরাসরি রিটার্ন করতে পারবেন, যা ক্লায়েন্টের জন্য আরও কার্যকর হবে।

সারাংশ:

  • Error ব্যবহার না করা: সাধারণ Error ক্লাস শুধু একটি মেসেজ ধারণ করে, যা কমপ্লেক্স অ্যাপ্লিকেশনে কার্যকর হয় না। এতে আপনি স্ট্যাটাস কোড, ত্রুটির প্রকৃতি (Operational vs Programming) বা স্ট্যাক ট্রেসের মতো তথ্য ব্যবহার করতে পারবেন না।
  • ApiError ব্যবহার করা: কাস্টম ApiError ক্লাসে আপনি স্ট্যাটাস কোড, মেসেজ, স্ট্যাক ট্রেস, এবং অপারেশনাল প্রকৃতি সবকিছু অন্তর্ভুক্ত করতে পারবেন, যা আপনার অ্যাপ্লিকেশনের ত্রুটি হ্যান্ডলিংকে আরও শক্তিশালী, সুবিধাজনক এবং সংগঠিত করে তোলে।

এভাবে ApiError ব্যবহার করলে অ্যাপ্লিকেশনটির কোড অনেক বেশি পরিষ্কার, স্থিতিশীল, এবং নির্ভরযোগ্য হয়ে ওঠে।

How can we help?