Custom Error Handling
আবার ValueError একটা বিল্ট-ইন এক্সসেপ্সন। আমরা চাইলে নিজেদের তৈরী (custom) এক্সসেপশন দেখতে পারি। কিভাবে করবো , তার একটি নমুনা কোড নিচে দেখা যাক ।
আউটপুট
উদাহরণ ১-
custom exception একটি উদাহরণ দেখা যাক যেখানে আমরা সিম্পুল custom exception ক্লাস তৈরি করে তা raise করছি ।
class CustomException(Exception):“”” my custom exception class “””try:raise CustomException(‘This is my custom exception’)except CustomException as ex:print(ex)আউটপুট
This is my custom exceptionউদাহরণ ২-
আমরা তো জানি যে কোন কিছু পরিমাপ বা টাকা গুনার ক্ষেত্রে কখন নেগেটিভ হয় নাহ । এই সব ক্ষেত্রে ইউজার যদি কোন ভাবে যদি নেগেটিভ ইনপুট দিয়ে দেয় তবে আমরা custom exception মাধ্যমে ইউজার এর ভুল হয়েছে তা বলতে পারবো.
class NegativeError(Exception):def __init__(self, data):self.data = datatry:x = int(input(“Enter a number between positive integer: “))if x < 0:raise NegativeError(x)except NegativeError as e:print(f“You provided {e}. Please provide positive integer values only”)আউটপুট
Enter a number between positive integer: -30You provided -30. Please provide positive integer values onlyউদাহরণ ৩-
ধরে যে আমাদের কোম্পানি তে একটি জব অফার দিলে এবং তাতে বলে দেওয়া হলো যে তাদের অই পজিশন এর জন্য বেতন রেজ্ঞ হচ্ছে ৫০০০-১৫০০০ । এবং যারা অই পজিশন এর জন্য আবেদন করবে তাদের সাম্ভাব্য কত বেতন পেলে তা বলে দিতে দেওয়া হলো । আমরা নিজেদের মত custom এক্সসেপশন তৈরি করে যা দিয়ে আমরা বলতে আবেদনকৃত ব্যাকটি এই পজিশনের জন্য উপযুক্ত কিনা
class SalaryNotInRangeError(Exception):def __init__(self, salary, message=“Salary is not in (5000, 15000) range”):self.salary = salaryself.message = messagesuper().__init__(self.message)def __str__(self):return f‘{self.salary} -> {self.message}’salary = int(input(“Enter salary amount: “))if not 5000 < salary < 15000:raise SalaryNotInRangeError(salary)আউটপুট
Enter salary amount: 30000__main__.SalaryNotInRangeError: 30000 –> Salary is not in (5000, 15000) rangeউদাহরণ ৪ –
আমাদের একটি কাজ করবো ম্যারেজ সাইট বানানো যে সাইট অবশ্যই আমাদের প্রথম চেক করতে হবে পাত্র/ পাত্রী বিয়ের বয়স হয়েছে কিনা । এই জন্য চলেন আমরা custom এক্সসেপশন তৈরি করি যা দিয়ে আমরা খুব সহজে বলতে পারবো অই জন বিবাহযোগ্য পাত্র/পাত্রী কিনা ।
# অই ব্যাক্তির বিবাহ বয়স হয়েছে কিনা তার জন্য custom exception তৈরি করলামclass TooYoungException(Exception):def __init__(self, arg):self.msg=arg# অই ব্যাক্তির বিবাহ বয়স পার হয়ে গেছে কিনা তার জন্য custom exception তৈরি করলামclass TooOldException(Exception):def __init__(self, arg):self.msg=argage=int(input(“Enter Age: “))if age>60:raise TooOldException(“Your age already crossed marriage age…no chance of getting marriage”)elif age<18:raise TooYoungException(“Plz wait some more time you will get best match soon!!!”)else:print(“You will get match details soon by email!!!”)ইনপুট আউটপুট Enter Age: 78 __main__.TooOldException: Your age already crossed marriage age…no chance of getting marriage Enter Age: 16 __main__.TooYoungException: Plz wait some more time you will get best match soon!!! Enter Age: 25 You will get match details soon by email!!! উদাহরণ ৫ –
আমরা এখন একটি তাপমাত্রা ক্যালকুলেট করার ফাংশন তৈরি করবো যা দিয়ে আমরা ফারেনহাইট থেকে সেলসিয়াস এ কনভার্ট করবো । কিন্তু আমরা জানি যে ফারেনহাইট রেজ্ঞ ৩২- ২১২ ভিতর থাকে । এর বাইরে ইনপুট দিলে আমরা custom এক্সসেপশন তৈরি করি ইউজার কে বলে দিতে পারবো যে আপনি ভুল ইনপুট দিয়েছেন ।
class FahrenheitError(Exception):min_f = 32max_f = 212def __init__(self, f, *args):super().__init__(args)self.f = fdef __str__(self):return f‘The {self.f} is not in a valid range {self.min_f, self.max_f}’def fahrenheit_to_celsius(f: float) –> float:if f < FahrenheitError.min_f or f > FahrenheitError.max_f:raise FahrenheitError(f)return (f – 32) * 5 / 9f = input(‘Enter a temperature in Fahrenheit:’)try:f = float(f)except ValueError as ex:print(ex)else:try:c = fahrenheit_to_celsius(float(f))except FahrenheitError as ex:print(ex)else:print(f‘{f} Fahrenheit = {c:.4f} Celsius’)আউটপুট
Enter a temperature in Fahrenheit:10The 10.0 is not in a valid range (32, 212)
- কিছু ইউজারনেমসহ একটি লিস্ট থাকবে । এরপর কনসোল থেকে ইউজার ইনপুট নিবেন, যদি ইনপুট স্ট্রিং যদি আপনার লিস্টের ইউজারনেম এর সাথে না মিলে তাইলে “Already Login” এই এরর মেসেজ দেখাবেন ।
- একটি ডিকশনারিতে কয়েকটা কি থাকবে ,কিন্তু আপনি ইউজার কে কয়েকটা key প্রিন্ট করতে দিবেন না , যদি প্রিন্ট করতে চান তাইলে এরর দিবে “Sorry can not access!”
- একটি custom exception লিখবেন যা মাধ্যমে ইউজার কে সর্তক করতে পারবো যে শুধু জোড় নাম্বার ইনপুট হিসাবে দেই । কারণ আমাদের এই প্রোগ্রাম জোড় নাম্বার আর কিছু বুজবে নাহ । দেখেন আবার ইনপুট স্টিং দিয়ে দেই নাহ যেনো কোন ইউজার ।
- আমরা একটু চেষ্টা করি যে custom exception মাধ্যমে কোন ইউজার অধিবর্ষ বা লিপ ইয়ার বাদে অন্য কোন বছর দিলে তা আমরা ভুল ইনপুট হিসাবে গণ্য করবে । আশা করি আমরা সবাই জানি লিপ ইয়ার কি ? আর যদি না জানি তবে প্রব্লেম নেই আমরা গুগল করে খুব সহজে জানতে পারবো লিপ ইয়ার কি এবং কোন কোন বছর গুলো লিপ ইয়ার ।
- আসলে আমাদের অ্যারের আবদার যে সে প্রাইম নাম্বার ছাড়া আর অন্য কিছু তার কাছে রাখবে নাহ । এখন আমরা ইচ্ছা করলে অই অ্যারে তে যা ইচ্ছা তাই রাখতে পারবো অ্যারে তে পাইথনের হিসাবে । এই কাজ করলে অ্যারে মুখে কিছু বলতে পারবে নাহ কিন্তু মনে মনে খুব ই কষ্ট পাবে । আমরা চাচ্ছি নাহ আমাদের এই কোড অই অ্যারে কে কষ্ট দেবার । তাই আমরা custom exception মাধ্যমে চেষ্টা করবে যে শুধু প্রাইম নাম্বার ই ঐ অ্যারে তে রাখার অন্য কোন নাম্বার আসলে অই নাম্বারকে ছোট একটা warning দিয়ে pass করে দিবে ।
- গুরুত্বপূর্ন প্রশ্নসমুহ
- আপনি যদি নিজের কোন এরর জেনারেট করতে চান , তাহলে কোন keyword লিখতে হবে ?
- custom exception বলতে আপনি কি বুঝেন ?
- custom error generate করার সুবিধা কি ?
- base exception ক্লাস এবং exception ক্লাস ভিতর পার্থক্য কি ?
- custom exception বাদে আমরা অন্য কোন ভাবে এরর গুলোকে হ্যান্ডেল করতে পারবো এবং পারলে কিভাবে সম্ভব ?