အခန်း 20 · animation 3 ခု

Chapter 19: Exception Handling (အမှားအယွင်း ကိုင်တွယ်ခြင်း)

808 Coder မှ တင်ဆက်သည်

ဒီအခန်းပြီးရင်...

  • Exception ဆိုတာ ဘာလဲ၊ ဘာကြောင့် ဖြစ်ရသလဲ ရှင်းပြနိုင်မယ်
  • try / except သုံးပြီး program crash မဖြစ်အောင် ကာကွယ်နိုင်မယ်
  • အဖြစ်များတဲ့ exception အမျိုးအစားတွေကို ခွဲခြားသိနိုင်မယ်
  • else၊ finally block တွေကို နေရာမှန်မှာ သုံးနိုင်မယ်
  • raise နဲ့ ကိုယ်တိုင် exception ထုတ်နိုင်ပြီး၊ ကိုယ်ပိုင် custom exception class တွေ ရေးနိုင်မယ်

Exception ဆိုတာ ဘာလဲ

Program တစ်ခု run နေတုန်းမှာ မမျှော်လင့်တဲ့ အမှား တစ်ခုခု ဖြစ်ပေါ်လာတတ်ပါတယ်။ ဥပမာ — အသုံးပြုသူက သုည လို့ ရိုက်ထည့်လိုက်လို့ စားခြင်း (division) လုပ်ရာမှာ error တက်တာမျိုး။ ဒီလို run-time မှာ ဖြစ်ပေါ်လာတဲ့ အမှားကို exception လို့ ခေါ်ပါတယ်။

Exception ဖြစ်တာနဲ့ program ရဲ့ ပုံမှန် စီးဆင်းမှု (normal flow) က ရပ်သွားပါတယ်။ အောက်က ဥပမာကို ကြည့်ပါ။

price = 100
people = 0
result = price / people
print("တွက်ချက်မှု ပြီးပါပြီ")

Output:

Traceback (most recent call last):
  File "example.py", line 3, in <module>
    result = price / people
             ~~~~~~^~~~~~~~
ZeroDivisionError: division by zero

သတိထားမိလား။ နောက်ဆုံး print("တွက်ချက်မှု ပြီးပါပြီ") ဆိုတဲ့ စာကြောင်းဟာ လုံးဝ run မဖြစ်လိုက်ပါဘူး။ Exception ဖြစ်တဲ့ နေရာမှာတင် program က ရပ်သွားတာပါ။

နေ့စဉ် ဘဝနဲ့ နှိုင်းရရင် ဒီလိုပါ။ ဆိုင်ရှင် တစ်ယောက်က ဈေးတွက်နေတုန်း ဂဏန်းပေါင်းစက်က error ပြပြီး ရပ်သွားရင်၊ ဖောက်သည်ကို ထားခဲ့ပြီး ဆိုင်ပိတ်လိုက်သလို ဖြစ်ပါတယ်။ Exception handling ဆိုတာကတော့ "အိုကေ၊ တစ်ခုခု မှားသွားပြီ — ပြန်စမ်းကြည့်ရအောင်" လို့ ယဉ်ယဉ်ကျေးကျေး ပြောနိုင်တဲ့ လက်ထောက် တစ်ယောက် ဘေးမှာ ထားသလိုပါပဲ။ Program crash မဖြစ်အောင်၊ အမှားဖြစ်ရင်တောင် လှလှပပ ဆက်သွားနိုင်အောင် ကာကွယ်ပေးတာပါ။

မှတ်ချက် — Exception နဲ့ syntax error ဟာ မတူပါဘူး။ Syntax error ဆိုတာ program မစခင်ကတည်းက Python က တွေ့တာ (ဥပမာ bracket ပိတ်ဖို့ မေ့တာ)။ Exception ကတော့ program run နေတုန်း ဖြစ်လာတာပါ။

Caught vs uncaught exceptions NO try/except int("abc") ValueError! program CRASHES everything stops WITH try/except try: int("abc") except: handle it program keeps running
exception မဖမ်းမိရင် crash ခြင်း၊ try/except နဲ့ ဆက်သွားနိုင်ခြင်း

Reference

  • Try...Except — try/except အခြေခံ သင်ခန်းစာ
  • Built-in types — Python ရဲ့ တည်ဆောက်ပြီးသား အမျိုးအစားများ

အဖြစ်များတဲ့ Exception အမျိုးအစားများ

Python မှာ exception အမျိုးအစား အများကြီး ရှိပါတယ်။ အတွေ့ရအများဆုံးတွေကို ဇယားနဲ့ မှတ်ထားပါ။

Exception ဘယ်အချိန်မှာ ဖြစ်လဲ
ZeroDivisionError သုညနဲ့ စားတဲ့အခါ
ValueError တန်ဖိုး မမှန်တဲ့အခါ (ဥပမာ int("abc"))
TypeError type မကိုက်ညီတဲ့ လုပ်ဆောင်ချက် (ဥပမာ "5" + 3)
FileNotFoundError မရှိတဲ့ ဖိုင်ကို ဖွင့်ဖို့ ကြိုးစားတဲ့အခါ
ModuleNotFoundError မရှိတဲ့ module ကို import လုပ်တဲ့အခါ
IndentationError indent (အကွာအဝေး) မှားတဲ့အခါ
IndexError list/tuple မှာ မရှိတဲ့ index ကို ခေါ်တဲ့အခါ

ဥပမာ — IndexError ကို လက်တွေ့ ကြည့်ရအောင်။

fruits = ["ပန်းသီး", "လိမ္မော်", "စပျစ်သီး"]
print(fruits[2])
print(fruits[5])

Output:

စပျစ်သီး
Traceback (most recent call last):
  ...
IndexError: list index out of range

fruits[2] ကတော့ အောင်မြင်ပါတယ်။ ဒါပေမဲ့ fruits[5] မှာ index 5 ဆိုတာ မရှိတဲ့အတွက် IndexError တက်ပြီး program ရပ်သွားပါတယ်။

နောက်တစ်ခု — ValueError ပါ။

age = int("နှစ်ဆယ်")

Output:

ValueError: invalid literal for int() with base 10: 'နှစ်ဆယ်'

int() က စာသားကို ဂဏန်းအဖြစ် ပြောင်းလို့ မရတဲ့အခါ ValueError တက်တာပါ။ အသုံးပြုသူက ဂဏန်းအစား စာရိုက်ထည့်မိရင် ဒီအမှား အဖြစ်များပါတယ်။

နောက်တစ်ခု — TypeError ပါ။ type မကိုက်ညီတဲ့ အရာတွေကို တွဲလုပ်မိတဲ့အခါ ဖြစ်ပါတယ်။

total = "5" + 3

Output:

TypeError: can only concatenate str (not "int") to str

စာသား "5" နဲ့ ဂဏန်း 3 ကို + နဲ့ ပေါင်းလို့ မရပါဘူး။ ဂဏန်းကို int("5") နဲ့ အရင် ပြောင်းရပါမယ်။ ဒီလို type မှားယွင်းမှုတွေက program ကြီးလာလေ၊ တွေ့ရများလေပါ။

သတိပြုရန် — အမျိုးအစား မသတ်မှတ်ဘဲ except: လို့ ချည်းရေးရင် exception အားလုံးကို ဖမ်းပါတယ်။ ဒါကို bare except လို့ ခေါ်ပြီး၊ အမှားကို ဖုံးကွယ်ထားသလို ဖြစ်စေနိုင်လို့ ရှောင်သင့်ပါတယ်။ ဖမ်းချင်တဲ့ exception အမျိုးအစားကို အမြဲ နာမည်တပ် ရေးပါ။

Reference

  • Try...Except — exception အမျိုးအစားနဲ့ ဖမ်းနည်းများ
  • Built-in functions — int() လို built-in function များ

try နဲ့ except — အခြေခံ ကိုင်တွယ်နည်း

အမှား ဖြစ်နိုင်တဲ့ code ကို try block ထဲ ထည့်ပါ။ အမှား ဖြစ်လာရင် except block ထဲက code က run ပြီး program ဆက်သွားပါတယ်။

try:
    # အမှား ဖြစ်နိုင်တဲ့ code
    risky_code()
except SomeException:
    # အမှား ကိုင်တွယ်တဲ့ code
    handle_it()

လက်တွေ့ ဥပမာ — ပျမ်းမျှ အမှတ် တွက်တဲ့ program ပါ။

try:
    total = int(input("စုစုပေါင်း အမှတ် ထည့်ပါ: "))
    subjects = int(input("ဘာသာရပ် အရေအတွက် ထည့်ပါ: "))
    average = total / subjects
    print("ပျမ်းမျှ အမှတ်:", average)
except ZeroDivisionError:
    print("ဘာသာရပ် အရေအတွက် သုည ဖြစ်လို့ မရပါ!")
except ValueError:
    print("ကိန်းဂဏန်း ထည့်ပေးပါ!")

အသုံးပြုသူက 0 ရိုက်ထည့်ရင် ပထမ except က အလုပ်လုပ်ပါတယ်။ စာသား ရိုက်ထည့်မိရင် ဒုတိယ except က အလုပ်လုပ်ပါတယ်။ နှစ်ခုလုံးမှာ program crash မဖြစ်ဘဲ၊ ယဉ်ယဉ်ကျေးကျေး message ပြပြီး ဆက်သွားပါတယ်။

Sample run (အသုံးပြုသူက 0 ရိုက်ထည့်တဲ့အခါ):

စုစုပေါင်း အမှတ် ထည့်ပါ: 450
ဘာသာရပ် အရေအတွက် ထည့်ပါ: 0
ဘာသာရပ် အရေအတွက် သုည ဖြစ်လို့ မရပါ!

အမှားရဲ့ အသေးစိတ်ကိုပါ သိချင်ရင် as နဲ့ ဖမ်းယူနိုင်ပါတယ်။

try:
    number = int(input("နံပါတ် ထည့်ပါ: "))
    print("10 ကို စားရင်:", 10 / number)
except Exception as e:
    print("အမှား အမျိုးအစား:", type(e).__name__)
    print("အသေးစိတ်:", e)

Sample run:

နံပါတ် ထည့်ပါ: abc
အမှား အမျိုးအစား: ValueError
အသေးစိတ်: invalid literal for int() with base 10: 'abc'

မှတ်ချက် — except block တွေကို အပေါ်ကနေ အောက်ကို အစဉ်လိုက် စစ်ပါတယ်။ ဒါကြောင့် အတိအကျဆုံး exception ကို အပေါ်မှာ၊ အကျယ်ဆုံး (Exception) ကို အောက်ဆုံးမှာ ထားပါ။

Reference

  • Try...Except — try/except အခြေခံ သင်ခန်းစာ
  • User input — input() နဲ့ အသုံးပြုသူထံမှ ရယူနည်း

Exception အမျိုးမျိုး ဖမ်းနည်း

အပေါ်က ဥပမာလို except block အများကြီး ရေးနိုင်သလို၊ exception အမျိုးအစားများစွာကို except တစ်ခု တည်းနဲ့လည်း ဖမ်းနိုင်ပါတယ်။ tuple ပုံစံနဲ့ ရေးတာပါ။

try:
    bill = int(input("စုစုပေါင်း ကျသင့်ငွေ: "))
    friends = int(input("ခွဲဝေမယ့် လူဦးရေ: "))
    share = bill / friends
    print("တစ်ဦးလျှင် ကျသင့်ငွေ:", share)
except (ValueError, ZeroDivisionError):
    print("ကိန်းဂဏန်း မှန်မှန်ထည့်ပါ။ လူဦးရေ သုည မဖြစ်ရပါ!")

except (ValueError, ZeroDivisionError): ဆိုတာ ဒီနှစ်မျိုးထဲက တစ်ခုခု ဖြစ်ရင် ဒီ block က အလုပ်လုပ်မယ် လို့ ဆိုလိုတာပါ။ ကိုင်တွယ်ပုံ အတူတူပဲ ဆိုရင် ဒီနည်းက code ကို တိုစေပါတယ်။

ဘယ် method ကို ရွေးမလဲ ဆိုတာ ကိုင်တွယ်ပုံ မတူရင် except သီးခြားစီ ရေးပါ။ ကိုင်တွယ်ပုံ တူရင် tuple ပုံစံ သုံးပါ။

Reference

  • Try...Except — exception များစွာ ဖမ်းနည်း
  • Built-in functions — built-in function များ၏ အမှားအယွင်းများ

else Block — အမှား မဖြစ်ရင် လုပ်မယ့်အရာ

try block အောင်အောင်မြင်မြင် ပြီးသွားရင် (exception တစ်စုံတစ်ရာ မဖြစ်ရင်) else block က run ပါတယ်။

try:
    marks = int(input("အမှတ် ထည့်ပါ: "))
except ValueError:
    print("ကိန်းဂဏန်း ထည့်ပေးပါ!")
else:
    print("ထည့်လိုက်တဲ့ အမှတ်:", marks)
    if marks >= 50:
        print("အောင်ပါတယ်!")

Sample run:

အမှတ် ထည့်ပါ: 75
ထည့်လိုက်တဲ့ အမှတ်: 75
အောင်ပါတယ်!

else ထဲက code ကို try ထဲမှာ တိုက်ရိုက် ရေးလို့လည်း ရတာပဲ — ဘာလို့ else လိုတာလဲ။ အကြောင်းရင်းက ရှင်းပါတယ်။ try block ထဲမှာ အမှား ဖြစ်နိုင်တဲ့ code သက်သက် ကိုပဲ ထားသင့်တာပါ။ အောင်မြင်ပြီးမှ လုပ်မယ့် လုပ်ငန်းတွေကို else ထဲ ရွှေ့ထားရင် code က ပိုရှင်းပြီး၊ မလိုအပ်တဲ့ အမှားတွေ ဖမ်းမိတာမျိုး ရှောင်နိုင်ပါတယ်။

Reference

  • Try...Except — try/except/else အပြည့်အစုံ

finally Block — ဘာဖြစ်ဖြစ် အမြဲလုပ်မယ့်အရာ

finally block ထဲက code ကတော့ exception ဖြစ်ဖြစ်၊ မဖြစ်ဖြစ်၊ အမြဲ run ပါတယ်။ ဖိုင် ပိတ်တာ၊ ဆက်သွယ်မှု ဖြတ်တာ လို သန့်ရှင်းရေး (cleanup) လုပ်ငန်းတွေအတွက် သုံးပါတယ်။

file = None
try:
    file = open("notes.txt", "r")
    print(file.read())
except FileNotFoundError:
    print("notes.txt ဖိုင် မတွေ့ပါ!")
finally:
    if file is not None:
        file.close()
    print("ဖိုင် ပိတ်ပြီးပါပြီ။")

ဒီမှာ file.close() ကို finally ထဲ ထည့်ထားလို့၊ ဖိုင် ဖတ်တာ အောင်မြင်သည်ဖြစ်စေ၊ FileNotFoundError ဖြစ်သည်ဖြစ်စေ၊ "ဖိုင် ပိတ်ပြီးပါပြီ။" ဆိုတဲ့ စာသားက အမြဲ ပေါ်ပါတယ်။ ဖိုင် ဖွင့်ပြီးသား ဖြစ်နေရင်လည်း သေချာပေါက် ပိတ်သွားပါတယ်။ (နောက် အခန်းမှာ with statement ဆိုတဲ့ ပိုကောင်းတဲ့ နည်းကို လေ့လာပါမယ်။)

try / except / else / finally လေးခုလုံး တွဲသုံးတဲ့ အစဉ်ကို မှတ်ထားပါ — အမှား ဖြစ်နိုင် → ဖမ်းမယ် → အောင်ရင် ဆက်လုပ်မယ် → ဘာဖြစ်ဖြစ် သန့်ရှင်းရေး လုပ်မယ်။

try / except / else / finally: what runs when? try: error? Yes except: No else: finally: (always runs) skipped
try / except / else / finally အလုပ်လုပ်တဲ့ အစဉ်လိုက်

Reference

  • Try...Except — finally block အသုံးပြုပုံ
  • Reading/writing files — ဖိုင်ဖွင့်/ပိတ် အလေ့အကျင့်များ

raise — ကိုယ်တိုင် Exception ထုတ်ခြင်း

Exception ကို Python က ထုတ်ပေးတာကို စောင့်နေစရာ မလိုပါဘူး။ ကိုယ့်ရဲ့ စည်းမျဉ်းနဲ့ မကိုက်ရင် ကိုယ်တိုင် raise နဲ့ ထုတ်လို့ ရပါတယ်။

def set_temperature(temp):
    if temp < -273:
        raise ValueError("အပူချိန် -273°C အောက် ဖြစ်လို့ မရပါ!")
    print("အပူချိန် သတ်မှတ်ပြီးပါပြီ:", temp)

try:
    set_temperature(-300)
except ValueError as e:
    print("အမှား:", e)

Output:

အမှား: အပူချိန် -273°C အောက် ဖြစ်လို့ မရပါ!

ဒီနည်းက function တစ်ခုကို မှားယွင်းတဲ့ အချက်အလက် ပေးမိတဲ့အခါ၊ အမှားကို စောစောစီးစီး ဖမ်းမိစေပါတယ်။ နောက်မှ ထူးဆန်းတဲ့ ရလဒ်တွေ ထွက်လာတာထက်၊ ချက်ချင်း အမှား ထုတ်လိုက်တာက debug လုပ်ရ ပိုလွယ်ပါတယ်။

Reference


ကိုယ်ပိုင် Exception ရေးခြင်း (Custom Exceptions)

ကိုယ့် program အတွက် သီးသန့် အမှား အမျိုးအစား လိုချင်ရင် class တစ်ခု ဖန်တီးပြီး Exception ကနေ အမွေဆက်ခံ (inherit) လုပ်ပါ။

class TooYoungError(Exception):
    pass

def register_voter(age):
    if age < 18:
        raise TooYoungError("မဲပေးဖို့ အသက် ၁၈ ပြည့်ရပါမယ်!")
    print("မဲစာရင်း တင်ပြီးပါပြီ!")

try:
    register_voter(15)
except TooYoungError as e:
    print("ဖမ်းမိတဲ့ အမှား:", e)

Output:

ဖမ်းမိတဲ့ အမှား: မဲပေးဖို့ အသက် ၁၈ ပြည့်ရပါမယ်!

အမှားနဲ့အတူ အချက်အလက် အပိုတွေ သယ်ချင်ရင် __init__ နဲ့ __str__ ကို ကိုယ်တိုင် ရေးနိုင်ပါတယ်။

class WithdrawError(Exception):
    def __init__(self, amount, balance):
        self.amount = amount
        self.balance = balance

    def __str__(self):
        return f"WithdrawError: {self.amount} ထုတ်လို့ မရပါ (လက်ကျန် {self.balance})"

def withdraw(amount, balance):
    if amount > balance:
        raise WithdrawError(amount, balance)
    print("ငွေ ထုတ်ယူပြီးပါပြီ!")

try:
    withdraw(8000, 5000)
except WithdrawError as e:
    print("ဖမ်းမိတဲ့ အမှား:", e)

Output:

ဖမ်းမိတဲ့ အမှား: WithdrawError: 8000 ထုတ်လို့ မရပါ (လက်ကျန် 5000)

Custom exception တွေက code ကို ပိုဖတ်ရလွယ်စေပါတယ်။ except WithdrawError: လို့ တွေ့တာနဲ့ ဒါက ငွေထုတ်တဲ့ အမှားပဲ ဆိုတာ ချက်ချင်း သိပါတယ်။

Making your own exception type Exception built-in inherits class MyError(Exception) your custom type raise MyError('...') / except MyError:
ကိုယ်ပိုင် exception class က Exception ကနေ အမွေဆက်ခံပုံ

Reference


Nested try-except — အထပ်ထပ် ကိုင်တွယ်ခြင်း

try block ထဲမှာ နောက် try တစ်ခု ထပ်ထည့်လို့ ရပါတယ်။ အတွင်းက မဖမ်းမိတဲ့ exception ဟာ အပြင်ကို ပျံ့သွားပြီး အပြင် except က ဖမ်းပါတယ်။

try:
    price = int(input("စုစုပေါင်း ဈေးနှုန်း: "))
    count = int(input("ပစ္စည်း အရေအတွက်: "))
    try:
        each = price / count
    except ZeroDivisionError:
        print("အတွင်း except: အရေအတွက် သုည ဖြစ်လို့ မရပါ!")
    else:
        print("အတွင်း else: တစ်ခုချင်း ဈေး =", each)
except ValueError:
    print("အပြင် except: ကိန်းဂဏန်း ထည့်ပေးပါ!")

ဒီမှာ စားခြင်း အမှား (ZeroDivisionError) ကို အတွင်းက ဖမ်းပါတယ်။ ဒါပေမဲ့ အသုံးပြုသူက စာသား ရိုက်ထည့်မိလို့ ValueError ဖြစ်ရင် အတွင်းမှာ ဖမ်းမထားလို့ အပြင်ကို ပျံ့ပြီး အပြင် except က ဖမ်းယူပါတယ်။ အတွင်း-အပြင် ခွဲထားတာက အမှား တစ်မျိုးစီကို သူ့နေရာနဲ့သူ ကိုင်တွယ်နိုင်စေပါတယ်။

Reference


လက်တွေ့ အသုံးများတဲ့ ပုံစံများ

သင်ထားတဲ့ အစိတ်အပိုင်းတွေကို လက်တွေ့ program တွေမှာ ဘယ်လို ပေါင်းသုံးလဲ ကြည့်ရအောင်။

မှန်တဲ့အထိ ပြန်တောင်းခြင်း

အသုံးပြုသူက မှားရိုက်မိတိုင်း program ကို ရပ်မပစ်ဘဲ၊ မှန်တဲ့အထိ ပြန်တောင်းတဲ့ ပုံစံပါ။ while loop နဲ့ try/except ကို တွဲသုံးတာပါ။

while True:
    try:
        age = int(input("အသက် ထည့်ပါ: "))
        break
    except ValueError:
        print("ကိန်းဂဏန်းပဲ ထည့်ပါ။ ပြန်ကြိုးစားပါ!")

print("ရရှိတဲ့ အသက်:", age)

Sample run:

အသက် ထည့်ပါ: နှစ်ဆယ်
ကိန်းဂဏန်းပဲ ထည့်ပါ။ ပြန်ကြိုးစားပါ!
အသက် ထည့်ပါ: 25
ရရှိတဲ့ အသက်: 25

ဘယ်လို အလုပ်လုပ်လဲ။ int() အောင်မြင်ရင် break နဲ့ loop က ထွက်ပါတယ်။ ValueError ဖြစ်ရင် message ပြပြီး loop က အစကနေ ပြန်စပါတယ်။ ဒီပုံစံက အသုံးပြုသူထံမှ အချက်အလက် တောင်းတဲ့ program တိုင်းမှာ သုံးလို့ ရပါတယ်။

try / except / else / finally အပြည့်အစုံ

အစိတ်အပိုင်း လေးခုလုံးကို တစ်ခုတည်း ပေါင်းထားတဲ့ ဥပမာပါ။

try:
    num = int(input("နံပါတ် ထည့်ပါ: "))
    result = 100 / num
except ValueError:
    print("ကိန်းဂဏန်း ထည့်ပေးပါ!")
except ZeroDivisionError:
    print("သုညနဲ့ စားလို့ မရပါ!")
else:
    print("ရလဒ်:", result)
finally:
    print("--- လုပ်ငန်း ပြီးဆုံးပါပြီ ---")

Sample run (အသုံးပြုသူက 4 ရိုက်ထည့်တဲ့အခါ):

နံပါတ် ထည့်ပါ: 4
ရလဒ်: 25.0
--- လုပ်ငန်း ပြီးဆုံးပါပြီ ---

အမှား ဖြစ်ရင်လည်း နောက်ဆုံး စာကြောင်းက အမြဲ ပေါ်ပါတယ်။ စီးဆင်းမှုကို ပြန်မှတ်ပါ — try မှာ စမ်းမယ် → except မှာ ဖမ်းမယ် → အောင်မြင်ရင် else မှာ ဆက်လုပ်မယ် → ဘာဖြစ်ဖြစ် finally မှာ အဆုံးသတ်မယ်။

Reference

  • Try...Except — လက်တွေ့ exception handling ပုံစံများ
  • User input — input() နဲ့ ပြန်တောင်းတဲ့ loop များ

assert — ယူဆချက် စစ်ဆေးခြင်း

assert statement က အခြေအနေ (condition) တစ်ခု မှန်ရမယ် လို့ "ယူဆချက်" ထားပြီး စစ်ဆေးတာပါ။ မှားနေရင် AssertionError ထုတ်ပြီး program ကို ရပ်ပါတယ်။

try:
    score = int(input("အမှတ် ထည့်ပါ (0-100): "))
    assert 0 <= score <= 100, "အမှတ် 0 မှ 100 အတွင်း ဖြစ်ရပါမယ်!"
except AssertionError as e:
    print("AssertionError:", e)
except ValueError:
    print("ကိန်းဂဏန်း ထည့်ပေးပါ!")
else:
    print("မှန်ကန်တဲ့ အမှတ်:", score)

Sample run:

အမှတ် ထည့်ပါ (0-100): 150
AssertionError: အမှတ် 0 မှ 100 အတွင်း ဖြစ်ရပါမယ်!

assert ကို အသုံးပြုသူရဲ့ အမှားကို ကိုင်တွယ်ဖို့ မဟုတ်ဘဲ၊ programmer ကိုယ်တိုင် "ဒီနေရာမှာ ဒီအခြေအနေ အမြဲ မှန်ရမယ်" လို့ ယုံကြည်ထားတာကို စစ်ဆေးဖို့ သုံးပါတယ်။ Test ရေးတာ၊ debug လုပ်တာမှာ အသုံးဝင်ပါတယ်။

မှတ်ချက် — assert တွေကို python -O (optimize) flag နဲ့ run ရင် Python က လျစ်လျူရှုပါတယ်။ ဒါကြောင့် အသုံးပြုသူ အမှားကို ကာကွယ်ဖို့ assert ကို အားကိုးမထားပါနဲ့ — အဲဒီအတွက် try/except ဒါမှမဟုတ် if စစ်ဆေးမှုကို သုံးပါ။

Reference


လေ့ကျင့်ခန်းများ

  1. [လွယ်ကူ] ရိုးရှင်းသော ဂဏန်းပေါင်းစက် — အသုံးပြုသူထံမှ ဂဏန်းနှစ်လုံး တောင်းပြီး ပေါင်း/နုတ်/မြှောက်/စား ရလဒ် လေးခုလုံး ပြတဲ့ program ရေးပါ။ ValueError (စာသား ရိုက်မိရင်) နဲ့ ZeroDivisionError (စားတဲ့ ဂဏန်း သုည ဖြစ်ရင်) တို့ကို try/except နဲ့ ကိုင်တွယ်ပါ။

  2. [အလတ်စား] အမည် ရွေးထုတ်စက် — ["Aung Aung", "Su Su", "Mg Mg", "Hla Hla"] ဆိုတဲ့ list တစ်ခုထားပြီး၊ အသုံးပြုသူကို index နံပါတ် တောင်းပါ။ except (ValueError, IndexError): tuple ပုံစံ သုံးပြီး အမှား နှစ်မျိုးလုံးကို message တစ်ခုတည်းနဲ့ ကိုင်တွယ်ပါ။

  3. [အလတ်စား] ကိုယ်ပိုင် အမှား — InsufficientBalanceError ဆိုတဲ့ custom exception class တစ်ခု ဖန်တီးပါ။ withdraw(amount, balance) function မှာ ထုတ်မယ့် ပမာဏက လက်ကျန်ထက် များနေရင် ဒီ exception ကို raise လုပ်ပါ။ try/except နဲ့ ဖမ်းပြီး သင့်တော်တဲ့ message ပြပါ။

  4. [ခက်ခဲ] ဖိုင် စာကြောင်းရေတွက်စက် — အသုံးပြုသူထံမှ ဖိုင်နာမည် တောင်းပြီး၊ ဖိုင်ထဲက စာကြောင်း အရေအတွက်ကို ရေတွက်ပြတဲ့ program ရေးပါ။ try/except FileNotFoundError/else/finally လေးခုလုံး သုံးပါ။ (finally မှာ "လုပ်ငန်း ပြီးဆုံးပါပြီ" လို့ ပြပါ။)

  5. [ခက်ခဲ] အမှတ် စစ်ဆေးသူ — check_score(score) ဆိုတဲ့ function ရေးပါ။ assert သုံးပြီး score ဟာ 0 မှ 100 အတွင်း ဖြစ်ရမယ် လို့ စစ်ပါ။ try/except AssertionError နဲ့ ခေါ်ယူပြီး၊ မှားရင် အကြောင်းပြချက် message ပြပါ။