Vivasoft-logo

Custom Error Handling

আমরা ইতিমধ্যে built-in error & exception সম্পর্কে জেনেছি এবং কিভাবে এসব এরর-একসেপশন হ্যান্ডেল করতে হবে সেগুলো শিখেছি। তবে , মাঝে মাঝে আমাদের নিজেদেরকেও একসেপশন তৈরী করা লাগতে পারে। যেমন ধরেন , আপনি ক্লাস ৫ এর বাচ্চাদের নামের লিস্ট আছে। এখন একটা ইনপুট এ ইউজার থেকে নাম নেয়ার ব্যবস্থা করলেন। কিন্তু সব স্ট্রিং ই আপনি একসেপ্ট করবেন না, শুধু মাত্র ওই ক্লাস ৫ এর বাচ্চাদের নামের লিস্ট এ যেইসব নাম রয়েছে , তেমন স্ট্রিং ই রিসিভ করবেন। কিন্তু পাইথন তো আর আলাদাভাবে স্ট্রিং পার্থক্য করে নিজে থেকে একসেপশন দিবে না। এইরকম , জায়গা গুলোতে আমরা নিজেদের তৈরী একসেপশন ব্যবহার করবো। কঠিন লাগতে পারে, তবে উদাহরণ দিলে ব্যাপারটা আরো ভালোভাবে পরিষ্কার হবে।
 
 
 
def vote(age):
if age < 18:
raise ValueError(“Age should at least 18”)
print(“You can vote”)
 

 

vote ফাংশন এ একটা প্যারামিটার রাখছি , যেখানে ১৮ এর নিচে কোন ভ্যালু আসলে , ValueError দিবে, কিন্তু এরর মেসেজ (Age should at least 18) হবে আমাদের জেনারেট করা । এভাবেই custom error raise করে ।
 
 

আবার ValueError একটা বিল্ট-ইন এক্সসেপ্সন। আমরা চাইলে নিজেদের তৈরী (custom) এক্সসেপশন দেখতে পারি। কিভাবে করবো , তার একটি নমুনা কোড নিচে দেখা যাক ।

 
 
 
# Create an empty class that would inherit any of the buil-in Exception
class custom_exception(ValueError):
pass
 
 
def vote(age):
try:
if(age<18):
raise custom_exception(“Can not vote”)
print(“You can vote”)
except custom_exception as e:
print(e)
 
 
vote(25)
vote(11)
 

আউটপুট

 
 
 
You can vote
Can not vote
 

 

খুবই সহজ। শুধু মাত্র একটি ক্লাস তৈরী করবো , যেটি বিল্ট-ইন কোন এক্সসেপ্সন কে ইনহেরিট করবে ( আমরা এখানে ValueError কে ইনহেরিট করেছি ) . এরপর ৮ নাম্বার লাইনে , আমাদের এক্সেপশন রেইজ করেছি।
  • উদাহরণ ১- 

    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 = data
     
    try:
    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: -30
    You 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 = salary
    self.message = message
    super().__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=arg
     
    age=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: 25You will get match details soon by email!!!

     

    উদাহরণ ৫ –

    আমরা এখন একটি তাপমাত্রা ক্যালকুলেট করার ফাংশন তৈরি করবো  যা দিয়ে আমরা ফারেনহাইট থেকে সেলসিয়াস এ কনভার্ট করবো  । কিন্তু আমরা জানি যে ফারেনহাইট রেজ্ঞ ৩২- ২১২ ভিতর থাকে । এর বাইরে ইনপুট দিলে আমরা custom এক্সসেপশন তৈরি করি ইউজার কে বলে দিতে পারবো যে আপনি ভুল ইনপুট দিয়েছেন ।

     
     
     
    class FahrenheitError(Exception):
    min_f = 32
    max_f = 212
     
    def __init__(self, f, *args):
    super().__init__(args)
    self.f = f
     
    def __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 / 9
    f = 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:10
    The 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 বাদে আমরা অন্য কোন ভাবে এরর গুলোকে হ্যান্ডেল করতে পারবো এবং পারলে কিভাবে সম্ভব ?