Table of Contents

    Class - XII: SEMESTER – III: Unit – 1: Python Programming: Section 15: Exception Handling

    Python Programming: Exception Handling

    ১. Exception Handling কী?

    Python programming-এ Exception Handling হলো এমন একটি mechanism যার মাধ্যমে program চলার সময় হওয়া unexpected error বা runtime problem সুন্দরভাবে handle করা যায়। যখন program execution-এর সময় কোনো সমস্যা হয়, তখন Python একটি exception তৈরি করে। যদি সেই exception handle না করা হয়, তাহলে program crash করে এবং execution বন্ধ হয়ে যায়।

    সহজভাবে বললে, exception handling হলো program-কে crash হওয়া থেকে বাঁচানোর একটি উপায়। এর মাধ্যমে programmer আগে থেকেই সম্ভাব্য error-এর জন্য প্রস্তুতি নিতে পারে এবং error হলে user-friendly message দেখাতে পারে।

    উদাহরণস্বরূপ, user যদি number input দেওয়ার জায়গায় text লিখে, তাহলে ValueError হতে পারে। আবার কোনো number-কে zero দিয়ে ভাগ করলে ZeroDivisionError হয়। এই ধরনের runtime errors handle করার জন্য Python-এ try, except, এবং finally blocks ব্যবহার করা হয়।

    Exception Handling ব্যবহারের সুবিধা:

    • Program crash হওয়া থেকে রক্ষা করে।
    • User-friendly error message দেখানো যায়।
    • Program execution controlled way-তে চালানো যায়।
    • Runtime errors handle করা যায়।
    • Input validation সহজ হয়।
    • File handling, database operation, network operation ইত্যাদিতে নিরাপত্তা বাড়ে।

    ২. Error এবং Exception-এর ধারণা

    Programming-এ error বলতে program-এর কোনো সমস্যা বোঝায়। সব error একই ধরনের নয়। কিছু error program run হওয়ার আগেই ধরা পড়ে, আবার কিছু error program চলার সময় ঘটে।

    Python-এ সাধারণত তিন ধরনের error সম্পর্কে শেখা হয়:

    • Syntax Error: code লেখার নিয়ম ভুল হলে হয়।
    • Logical Error: program run হয় কিন্তু output ভুল আসে।
    • Runtime Error বা Exception: program চলার সময় কোনো সমস্যা হলে হয়।

    Exception handling মূলত runtime error বা exception handle করার জন্য ব্যবহৃত হয়। Syntax error exception handling দিয়ে handle করা যায় না, কারণ syntax error হলে program execution শুরুই হয় না।

    Runtime Exception Example:

    number = int(input("একটি সংখ্যা লিখুন: "))
    
    result = 10 / number
    
    print(result)

    যদি user 0 input দেয়, তাহলে ZeroDivisionError হবে। যদি user abc input দেয়, তাহলে ValueError হবে। এই ধরনের problem handle করার জন্য exception handling দরকার।

    ৩. Exception Handling কেন দরকার?

    বাস্তব জীবনের program-এ user সবসময় সঠিক input দেবে এমন নিশ্চয়তা নেই। কোনো file না থাকতে পারে, কোনো list-এর invalid index access হতে পারে, dictionary-তে key না থাকতে পারে, অথবা কোনো calculation-এর সময় zero division হতে পারে। এইসব ক্ষেত্রে program যদি crash করে, তাহলে user experience খারাপ হয় এবং software unreliable মনে হয়।

    Exception handling ব্যবহার করলে program unexpected situation-এও controlled way-তে response দিতে পারে। এটি professional software development-এর জন্য খুবই গুরুত্বপূর্ণ।

    Real-life Example:

    • Banking application-এ invalid amount input হলে program crash না করে warning দেখাবে।
    • Login system-এ missing user data হলে proper message দেখাবে।
    • File processing program-এ file না থাকলে “File not found” message দেখাবে।
    • Calculator program-এ zero দিয়ে divide করলে crash না করে error message দেখাবে।

    ৪. Common Exceptions in Python

    Python-এ বিভিন্ন ধরনের built-in exceptions আছে। Beginner level-এ কিছু common exceptions জানা খুব জরুরি।

    Exception Name কখন হয় Example
    ZeroDivisionError কোনো number-কে zero দিয়ে ভাগ করলে 10 / 0
    ValueError ভুল ধরনের value convert করার চেষ্টা করলে int("abc")
    TypeError ভুল data type-এর উপর operation করলে "Age" + 20
    IndexError List বা tuple-এর invalid index access করলে numbers[10]
    KeyError Dictionary-তে unavailable key access করলে student["marks"]
    FileNotFoundError যে file নেই সেটি open করতে চাইলে open("abc.txt")
    NameError Undefined variable ব্যবহার করলে print(x) যেখানে x define করা নেই

    ৫. try-except Block

    Python-এ exception handle করার সবচেয়ে basic structure হলো try-except block। যে code-এ error হওয়ার possibility আছে সেটি try block-এর ভিতরে লেখা হয়। যদি try block-এর ভিতরে exception ঘটে, তাহলে Python সরাসরি matching except block execute করে।

    Syntax:

    try:
        risky_code
    except ExceptionType:
        error_handling_code

    Example: ZeroDivisionError Handle করা

    try:
        number = int(input("একটি সংখ্যা লিখুন: "))
        result = 10 / number
        print("Result:", result)
    
    except ZeroDivisionError:
        print("Zero দিয়ে ভাগ করা যায় না")

    এখানে user যদি 0 input দেয়, তাহলে program crash করবে না। Instead, except block execute হবে এবং user-friendly message দেখাবে।

    Important: try block-এর মধ্যে সেই code লেখা উচিত যেখানে exception হওয়ার possibility আছে। except block-এর মধ্যে error হলে কী করা হবে তা লেখা হয়।

    ৬. ValueError Handle করা

    User input নিয়ে কাজ করার সময় ValueError খুব common। কারণ input() function সবসময় string return করে। যদি user number না লিখে text লিখে এবং আমরা সেটিকে int() বা float() করতে চাই, তাহলে ValueError হতে পারে।

    Example:

    try:
        age = int(input("আপনার age লিখুন: "))
        print("আপনার age:", age)
    
    except ValueError:
        print("দয়া করে শুধু number লিখুন")

    এখানে user যদি twenty বা abc লিখে, তাহলে program crash না করে message দেখাবে।

    ৭. Multiple except Blocks

    একটি try block-এর ভিতরে বিভিন্ন ধরনের exception হতে পারে। তাই আমরা multiple except block ব্যবহার করতে পারি। এতে প্রতিটি exception-এর জন্য আলাদা message বা action define করা যায়।

    Example:

    try:
        number = int(input("একটি সংখ্যা লিখুন: "))
        result = 100 / number
        print("Result:", result)
    
    except ValueError:
        print("Invalid input! দয়া করে number লিখুন")
    
    except ZeroDivisionError:
        print("Zero দিয়ে ভাগ করা যায় না")

    Explanation:

    1. User যদি text input দেয়, তাহলে ValueError handle হবে।
    2. User যদি 0 input দেয়, তাহলে ZeroDivisionError handle হবে।
    3. User valid non-zero number দিলে result print হবে।

    ৮. Generic except Block

    কখনো কখনো আমরা নির্দিষ্ট exception না লিখে সাধারণ except block ব্যবহার করি। এটি যেকোনো exception catch করতে পারে। তবে professional coding-এ specific exception handle করা বেশি ভালো।

    Example:

    try:
        number = int(input("একটি সংখ্যা লিখুন: "))
        result = 10 / number
        print(result)
    
    except:
        print("কোনো একটি error হয়েছে")

    এখানে যেকোনো error হলে একই message দেখাবে। কিন্তু কোন error হয়েছে তা বোঝা যাবে না।

    Good Practice: যতটা সম্ভব specific exception ব্যবহার করা উচিত, যেমন ValueError, ZeroDivisionError, IndexError ইত্যাদি।

    ৯. Exception Object ব্যবহার করা

    Python-এ exception-এর detail message পেতে as keyword ব্যবহার করা যায়। এতে exception object একটি variable-এ store হয় এবং আমরা actual error message দেখতে পারি।

    Example:

    try:
        number = int(input("একটি সংখ্যা লিখুন: "))
        result = 10 / number
        print(result)
    
    except Exception as error:
        print("Error occurred:", error)

    এখানে error হলে actual error message error variable-এর মাধ্যমে print হবে। Debugging-এর সময় এটি helpful হতে পারে।

    ১০. finally Block

    finally block হলো এমন একটি block যা exception হোক বা না হোক, সবসময় execute হয়। অর্থাৎ try block successful হলেও finally execute হবে, আবার exception handle হলেও finally execute হবে।

    সাধারণত cleanup কাজ করার জন্য finally block ব্যবহার করা হয়। যেমন file close করা, database connection close করা, temporary resource release করা, বা program end message দেখানো।

    Syntax:

    try:
        risky_code
    except ExceptionType:
        error_handling_code
    finally:
        cleanup_code

    Example:

    try:
        number = int(input("একটি সংখ্যা লিখুন: "))
        result = 10 / number
        print("Result:", result)
    
    except ZeroDivisionError:
        print("Zero দিয়ে ভাগ করা যায় না")
    
    except ValueError:
        print("Invalid input! শুধু number লিখুন")
    
    finally:
        print("Program execution completed")

    এখানে user valid input দিক বা invalid input দিক, finally block সবসময় execute হবে।

    ১১. try-except-finally Execution Flow

    try-except-finally block কীভাবে execute হয় তা বুঝা খুব গুরুত্বপূর্ণ।

    Case 1: কোনো Exception না হলে

    1. try block execute হবে।
    2. কোনো exception না হলে except block skip হবে।
    3. finally block execute হবে।

    Case 2: Exception হলে এবং Handle হলে

    1. try block execute হতে শুরু করবে।
    2. Exception ঘটলে try block-এর বাকি code skip হবে।
    3. Matching except block execute হবে।
    4. finally block execute হবে।

    Case 3: Exception হলে কিন্তু Matching except না থাকলে

    1. try block execute হতে শুরু করবে।
    2. Exception ঘটবে।
    3. Matching except না থাকলে exception propagate করবে।
    4. তারপরও finally block execute হবে।
    5. শেষে program error দেখিয়ে stop হতে পারে।
    Important: finally block সাধারণত সব অবস্থায় execute হয়। তাই resource cleanup-এর জন্য এটি খুব useful।

    ১২. Example: IndexError Handle করা

    List বা tuple-এর এমন index access করলে যা exist করে না, তখন IndexError হয়।

    try:
        numbers = [10, 20, 30]
    
        index = int(input("Index লিখুন: "))
    
        print("Value:", numbers[index])
    
    except IndexError:
        print("Invalid index! List-এর range-এর বাইরে index দেওয়া হয়েছে")
    
    except ValueError:
        print("Index হিসেবে শুধু number লিখুন")
    
    finally:
        print("List access operation finished")

    এখানে user যদি invalid index দেয়, তাহলে IndexError handle হবে। আর user যদি number না লিখে text দেয়, তাহলে ValueError handle হবে।

    ১৩. Example: Dictionary KeyError Handle করা

    Dictionary-তে এমন key access করলে যা dictionary-এর মধ্যে নেই, তখন KeyError হয়।

    try:
        student = {
            "name": "Rahim",
            "age": 20
        }
    
        key = input("কোন key access করবেন? ")
    
        print("Value:", student[key])
    
    except KeyError:
        print("এই key dictionary-এর মধ্যে নেই")
    
    finally:
        print("Dictionary access completed")

    যদিও dictionary access করার জন্য get() method অনেক সময় safe option, তবুও exception handling দিয়ে KeyError handle করা শেখা গুরুত্বপূর্ণ।

    ১৪. Example: File Handling-এ Exception

    File handling-এর সময় exception handling খুব গুরুত্বপূর্ণ। কারণ file exist না করতে পারে, file permission না থাকতে পারে, অথবা file read/write করার সময় problem হতে পারে।

    try:
        file = open("data.txt", "r")
        content = file.read()
        print(content)
    
    except FileNotFoundError:
        print("File পাওয়া যায়নি")
    
    finally:
        print("File operation completed")

    এখানে যদি data.txt file না থাকে, তাহলে FileNotFoundError handle হবে।

    Note: File successfully open হলে file close করা গুরুত্বপূর্ণ। বাস্তব program-এ with open() ব্যবহার করা আরও ভালো practice, কারণ এটি automatically file close করে।

    ১৫. finally Block কেন দরকার?

    finally block সাধারণত এমন কাজের জন্য ব্যবহার করা হয় যা যেকোনো অবস্থাতেই করা দরকার। যেমন file close করা, database connection close করা, network connection release করা, অথবা final message দেখানো।

    Example:

    file = None
    
    try:
        file = open("data.txt", "r")
        content = file.read()
        print(content)
    
    except FileNotFoundError:
        print("File পাওয়া যায়নি")
    
    finally:
        if file is not None:
            file.close()
            print("File closed")
    
        print("Program finished")

    এখানে file open হলে finally block-এ file close করা হচ্ছে। যদি file open না হয়, তাহলে file close করার চেষ্টা করা হবে না।

    ১৬. try-except-finally Structure Summary

    Block কাজ কখন execute হয়
    try যে code-এ exception হতে পারে তা রাখা হয় প্রথমে execute হয়
    except Exception handle করার code লেখা হয় try block-এ matching exception হলে execute হয়
    finally Cleanup বা final কাজের code লেখা হয় Exception হোক বা না হোক execute হয়

    ১৭. Simple Program ১: Division Calculator with Exception Handling

    এই program user থেকে দুইটি number নিয়ে division করে। যদি user invalid input দেয় বা divisor zero হয়, তাহলে exception handle করা হয়।

    try:
        num1 = float(input("প্রথম সংখ্যা লিখুন: "))
        num2 = float(input("দ্বিতীয় সংখ্যা লিখুন: "))
    
        result = num1 / num2
    
        print("Division result:", result)
    
    except ValueError:
        print("Invalid input! দয়া করে valid number লিখুন")
    
    except ZeroDivisionError:
        print("Zero দিয়ে ভাগ করা যায় না")
    
    finally:
        print("Division program completed")

    Explanation:

    1. User থেকে দুইটি number input নেওয়া হয়েছে।
    2. float() conversion করা হয়েছে, তাই invalid input হলে ValueError হতে পারে।
    3. Division operation করা হয়েছে, তাই second number zero হলে ZeroDivisionError হতে পারে।
    4. finally block সবসময় final message দেখায়।

    ১৮. Simple Program ২: Age Input Validation

    এই program user থেকে age input নিয়ে check করে age valid কিনা। যদি user number না দেয়, তাহলে ValueError handle করা হয়।

    try:
        age = int(input("আপনার age লিখুন: "))
    
        if age < 0:
            print("Age negative হতে পারে না")
        else:
            print("আপনার age:", age)
    
    except ValueError:
        print("Invalid input! Age হিসেবে number লিখুন")
    
    finally:
        print("Age checking completed")

    ১৯. Simple Program ৩: List Element Access

    এই program একটি list থেকে user-এর দেওয়া index অনুযায়ী value দেখায়। এখানে ValueError এবং IndexError handle করা হয়েছে।

    try:
        fruits = ["Apple", "Banana", "Mango"]
    
        index = int(input("Index লিখুন: "))
    
        print("Selected fruit:", fruits[index])
    
    except ValueError:
        print("Index হিসেবে valid integer লিখুন")
    
    except IndexError:
        print("Invalid index! List-এর বাইরে index দেওয়া হয়েছে")
    
    finally:
        print("Fruit selection completed")

    ২০. Nested try-except

    একটি try-except block-এর ভিতরে আরেকটি try-except block থাকলে তাকে nested try-except বলা হয়। Complex program-এ আলাদা আলাদা অংশের error আলাদাভাবে handle করার জন্য nested try-except ব্যবহার করা যেতে পারে।

    Example:

    try:
        number = int(input("একটি সংখ্যা লিখুন: "))
    
        try:
            result = 100 / number
            print("Result:", result)
    
        except ZeroDivisionError:
            print("Zero দিয়ে ভাগ করা যায় না")
    
    except ValueError:
        print("Invalid input! Number লিখুন")
    
    finally:
        print("Nested try-except example completed")

    এখানে বাইরের try block input conversion handle করছে এবং ভিতরের try block division operation handle করছে।

    ২১. try-except-finally Full Example

    নিচের complete program-এ user input, type conversion, calculation, multiple exceptions এবং finally block ব্যবহার করা হয়েছে।

    try:
        print("Simple Calculator")
    
        num1 = float(input("প্রথম সংখ্যা লিখুন: "))
        num2 = float(input("দ্বিতীয় সংখ্যা লিখুন: "))
    
        print("1. Addition")
        print("2. Subtraction")
        print("3. Multiplication")
        print("4. Division")
    
        choice = int(input("Choice লিখুন: "))
    
        if choice == 1:
            print("Result:", num1 + num2)
    
        elif choice == 2:
            print("Result:", num1 - num2)
    
        elif choice == 3:
            print("Result:", num1 * num2)
    
        elif choice == 4:
            print("Result:", num1 / num2)
    
        else:
            print("Invalid choice")
    
    except ValueError:
        print("Invalid input! দয়া করে number লিখুন")
    
    except ZeroDivisionError:
        print("Zero দিয়ে ভাগ করা যায় না")
    
    finally:
        print("Calculator program finished")

    Program Explanation:

    1. User থেকে দুইটি number নেওয়া হয়েছে।
    2. User menu থেকে operation choice দেয়।
    3. Choice অনুযায়ী calculation করা হয়।
    4. Invalid numeric input হলে ValueError handle হয়।
    5. Division-এর সময় denominator zero হলে ZeroDivisionError handle হয়।
    6. finally block program শেষে message দেখায়।

    ২২. Exception Handling Summary Table

    Concept ব্যাখ্যা Example
    Exception Runtime error বা program চলার সময় problem ZeroDivisionError
    try Risky code রাখার block try: result = 10 / x
    except Exception handle করার block except ZeroDivisionError:
    finally সবসময় execute হওয়া block finally: print("Done")
    Multiple except ভিন্ন exception-এর জন্য ভিন্ন block except ValueError:
    Generic except সব exception catch করে except:
    Exception object Error message variable-এ রাখা except Exception as e:

    ২৩. Common Mistakes in Exception Handling

    • Exception handle না করা: Runtime error হলে program crash করতে পারে।
    • খুব broad except ব্যবহার করা: শুধু except: দিলে actual error বোঝা কঠিন হতে পারে।
    • Specific exception না লেখা: ভালো practice হলো ValueError, ZeroDivisionError ইত্যাদি নির্দিষ্ট exception handle করা।
    • try block-এ খুব বেশি code রাখা: এতে কোন line error দিচ্ছে বোঝা কঠিন হয়।
    • finally block ভুল বোঝা: finally exception হোক বা না হোক execute হয়।
    • except block-এর order ভুল রাখা: specific exception আগে এবং generic exception পরে রাখা উচিত।
    • Error message user-friendly না করা: user যেন বুঝতে পারে কী ভুল হয়েছে।

    Wrong Example:

    try:
        number = int(input("Number: "))
        result = 10 / number
        print(result)
    
    except:
        print("Error")

    এখানে error message খুব generic। User বুঝতে পারবে না input ভুল ছিল নাকি zero division problem ছিল।

    Better Example:

    try:
        number = int(input("Number: "))
        result = 10 / number
        print(result)
    
    except ValueError:
        print("দয়া করে valid integer লিখুন")
    
    except ZeroDivisionError:
        print("Zero দিয়ে ভাগ করা যায় না")

    ২৪. Best Practices

    • যেখানে exception হওয়ার possibility আছে শুধুমাত্র সেই code try block-এ রাখুন।
    • Specific exception handle করুন, যেমন ValueError, ZeroDivisionError
    • User-friendly error message দিন।
    • Debugging-এর জন্য exception object ব্যবহার করতে পারেন।
    • Cleanup কাজের জন্য finally block ব্যবহার করুন।
    • Generic except: খুব বেশি ব্যবহার করবেন না।
    • Input validation এবং exception handling একসাথে ব্যবহার করলে program বেশি reliable হয়।

    ২৫. উপসংহার

    Exception Handling Python programming-এর একটি অত্যন্ত গুরুত্বপূর্ণ concept। Program চলার সময় unexpected problem হলে exception তৈরি হয়। যদি এই exception handle না করা হয়, তাহলে program crash করতে পারে এবং user খারাপ experience পেতে পারে।

    Python-এ exception handle করার জন্য try, except, এবং finally block ব্যবহার করা হয়। try block-এর মধ্যে risky code রাখা হয়, except block exception handle করে, আর finally block সবসময় execute হয়। Multiple except blocks ব্যবহার করে বিভিন্ন ধরনের exception আলাদাভাবে handle করা যায়।

    User input, division operation, list indexing, dictionary access এবং file handling-এর সময় exception handling বিশেষভাবে গুরুত্বপূর্ণ। ভালো exception handling program-কে stable, user-friendly এবং professional করে তোলে। একজন beginner programmer-এর জন্য exception handling শেখা জরুরি, কারণ real-world software development-এ error-free program লেখা সম্ভব নয়, কিন্তু error হলে program কীভাবে smartly handle করবে সেটিই একজন ভালো programmer-এর দক্ষতা।