Python / Алдаа зохицуулах (try/except)

Алдаа зохицуулах (try/except)

Программ бичихэд алдаа гарах нь зайлшгүй зүйл — хэрэглэгч буруу утга оруулах, файл байхгүй байх, сүлжээ тасрах гэх мэт. Ийм тохиолдолд программ гэнэт унахаас сэргийлж алдааг "барьж авах" механизмыг exception handling гэнэ.

Python-д try/except блок энэ үүргийг гүйцэтгэнэ. Мэргэжлийн программ бүр алдаа зохицуулалттай байдаг — энэ бол сайн код бичих чухал ур чадвар.

Exception гэж юу вэ?

Кодыг ажиллуулахад алдаа гарвал Python нэг төрлийн exception "шидэнэ" (raise). Жишээлбэл:

python
тоо = int("сайн уу")   # ValueError
жагсаалт = [1, 2, 3]
print(жагсаалт[10])    # IndexError
10 / 0                 # ZeroDivisionError

Exception "барьж аваагүй" тохиолдолд программ зогсоод traceback гаргана. try/except ашиглан энэ алдааг барьж, программыг үргэлжлүүлж болно.

Үндсэн try/except

python
try:
    тоо = int(input("Тоо оруулна уу: "))
    print(f"Та {тоо} оруулсан байна")
except ValueError:
    print("Алдаа: тоо биш утга оруулсан байна")
  • try блок дахь код ажиллана
  • Алдаа гарвал except блок ажиллана
  • Алдаа гараагүй бол except блок алгасагдана

Олон төрлийн Exception барих

Өөр өөр алдааны төрлийг тус тусад нь зохицуулж болно:

python
def хуваах(а, б):
    try:
        үр_дүн = а / б
        print(f"Үр дүн: {үр_дүн}")
    except ZeroDivisionError:
        print("Алдаа: тэгд хуваах боломжгүй")
    except TypeError:
        print("Алдаа: тоон утга өгнө үү")

хуваах(10, 2)    # Үр дүн: 5.0
хуваах(10, 0)    # Алдаа: тэгд хуваах боломжгүй
хуваах(10, "а")  # Алдаа: тоон утга өгнө үү

Нэг except-д хэд хэдэн алдааны төрлийг хамт барих:

python
try:
    утга = int(input("Тоо оруулна уу: "))
    үр_дүн = 100 / утга
except (ValueError, ZeroDivisionError):
    print("Буруу утга оруулсан байна")

else ба finally

try/except-д нэмэлт хоёр блок бий:

python
try:
    тоо = int(input("Тоо оруулна уу: "))
    үр_дүн = 100 / тоо
except ZeroDivisionError:
    print("Тэгд хуваах боломжгүй")
except ValueError:
    print("Тоо биш утга оруулсан")
else:
    # Алдаа ГАРААГҮЙ тохиолдолд ажиллана
    print(f"Үр дүн: {үр_дүн}")
finally:
    # Алдаа гарсан ч гараагүй ч ЗААВАЛ ажиллана
    print("Программ дуусав")

finally нь файл хаах, сүлжээний холболт таслах гэх мэт "цэвэрлэгээний" ажлуудад ашиглагддаг.

Алдааны мэдээллийг авах

as түлхүүр үгийг ашиглан алдааны объектыг хувьсагчид оноож болно:

python
try:
    тоо = int("үсэг")
except ValueError as алдаа:
    print(f"Алдааны мэдээлэл: {алдаа}")
    # Алдааны мэдээлэл: invalid literal for int() with base 10: 'үсэг'

Ямар ч алдааг барихад ерөнхий Exception ашигладаг — ихэвчлэн debug хийхэд хэрэгтэй:

python
try:
    # ямар нэг тодорхойгүй алдаа гарч болох код
    утга = 1 / 0
except Exception as алдаа:
    print(f"Гэнэтийн алдаа гарлаа: {type(алдаа).__name__}: {алдаа}")

Файлтай ажиллах жишээ

Файл олдохгүй тохиолдол бодит программд маш нийтлэг:

python
def файл_унших(нэр):
    try:
        with open(нэр, "r", encoding="utf-8") as файл:
            агуулга = файл.read()
            print(агуулга)
    except FileNotFoundError:
        print(f"Алдаа: '{нэр}' файл олдсонгүй")
    except PermissionError:
        print(f"Алдаа: '{нэр}' файлыг нээх эрх байхгүй")

файл_унших("байхгүй_файл.txt")
# Алдаа: 'байхгүй_файл.txt' файл олдсонгүй

Өөрийн Exception үүсгэх

Томоохон программд өөрийн алдааны төрлийг тодорхойлж болно:

python
class НасныАлдаа(Exception):
    pass

def нас_шалгах(нас):
    if нас < 0:
        raise НасныАлдаа("Нас сөрөг байж болохгүй")
    if нас > 150:
        raise НасныАлдаа("Нас хэтэрхий их байна")
    return f"Нас зөв: {нас}"

try:
    print(нас_шалгах(-5))
except НасныАлдаа as алдаа:
    print(f"Алдаа гарлаа: {алдаа}")

# Алдаа гарлаа: Нас сөрөг байж болохгүй

Нийтлэг Exception төрлүүд

| Exception | Учир шалтгаан | | ------------------ | --------------------------------------- | | ValueError | Буруу төрлийн утга (int("abc")) | | TypeError | Буруу өгөгдлийн төрл ("5" + 5) | | ZeroDivisionError| Тэгд хуваасан | | IndexError | Жагсаалтын хүрээнээс гарсан index | | KeyError | Dictionary-д байхгүй key | | FileNotFoundError| Файл олдсонгүй | | AttributeError | Object-д байхгүй attribute | | NameError | Тодорхойлогдоогүй хувьсагч |

Дараагийн хичээлд:

Файл унших ба бичих (File I/O) хичээлд файлтай ажиллах бүрэн аргуудыг судална — текст болон JSON файл унших, бичих, with statement ашиглах, encoding зохицуулах аргуудыг үзнэ.