Алдаа зохицуулах (try/except)
Программ бичихэд алдаа гарах нь зайлшгүй зүйл — хэрэглэгч буруу утга оруулах, файл байхгүй байх, сүлжээ тасрах гэх мэт. Ийм тохиолдолд программ гэнэт унахаас сэргийлж алдааг "барьж авах" механизмыг exception handling гэнэ.
Python-д try/except блок энэ үүргийг гүйцэтгэнэ. Мэргэжлийн программ бүр алдаа зохицуулалттай байдаг — энэ бол сайн код бичих чухал ур чадвар.
Exception гэж юу вэ?
Кодыг ажиллуулахад алдаа гарвал Python нэг төрлийн exception "шидэнэ" (raise). Жишээлбэл:
тоо = int("сайн уу") # ValueError
жагсаалт = [1, 2, 3]
print(жагсаалт[10]) # IndexError
10 / 0 # ZeroDivisionError
Exception "барьж аваагүй" тохиолдолд программ зогсоод traceback гаргана. try/except ашиглан энэ алдааг барьж, программыг үргэлжлүүлж болно.
Үндсэн try/except
try:
тоо = int(input("Тоо оруулна уу: "))
print(f"Та {тоо} оруулсан байна")
except ValueError:
print("Алдаа: тоо биш утга оруулсан байна")
tryблок дахь код ажиллана- Алдаа гарвал
exceptблок ажиллана - Алдаа гараагүй бол
exceptблок алгасагдана
Олон төрлийн Exception барих
Өөр өөр алдааны төрлийг тус тусад нь зохицуулж болно:
def хуваах(а, б):
try:
үр_дүн = а / б
print(f"Үр дүн: {үр_дүн}")
except ZeroDivisionError:
print("Алдаа: тэгд хуваах боломжгүй")
except TypeError:
print("Алдаа: тоон утга өгнө үү")
хуваах(10, 2) # Үр дүн: 5.0
хуваах(10, 0) # Алдаа: тэгд хуваах боломжгүй
хуваах(10, "а") # Алдаа: тоон утга өгнө үү
Нэг except-д хэд хэдэн алдааны төрлийг хамт барих:
try:
утга = int(input("Тоо оруулна уу: "))
үр_дүн = 100 / утга
except (ValueError, ZeroDivisionError):
print("Буруу утга оруулсан байна")
else ба finally
try/except-д нэмэлт хоёр блок бий:
try:
тоо = int(input("Тоо оруулна уу: "))
үр_дүн = 100 / тоо
except ZeroDivisionError:
print("Тэгд хуваах боломжгүй")
except ValueError:
print("Тоо биш утга оруулсан")
else:
# Алдаа ГАРААГҮЙ тохиолдолд ажиллана
print(f"Үр дүн: {үр_дүн}")
finally:
# Алдаа гарсан ч гараагүй ч ЗААВАЛ ажиллана
print("Программ дуусав")
finally нь файл хаах, сүлжээний холболт таслах гэх мэт "цэвэрлэгээний" ажлуудад ашиглагддаг.
Алдааны мэдээллийг авах
as түлхүүр үгийг ашиглан алдааны объектыг хувьсагчид оноож болно:
try:
тоо = int("үсэг")
except ValueError as алдаа:
print(f"Алдааны мэдээлэл: {алдаа}")
# Алдааны мэдээлэл: invalid literal for int() with base 10: 'үсэг'
Ямар ч алдааг барихад ерөнхий Exception ашигладаг — ихэвчлэн debug хийхэд хэрэгтэй:
try:
# ямар нэг тодорхойгүй алдаа гарч болох код
утга = 1 / 0
except Exception as алдаа:
print(f"Гэнэтийн алдаа гарлаа: {type(алдаа).__name__}: {алдаа}")
Файлтай ажиллах жишээ
Файл олдохгүй тохиолдол бодит программд маш нийтлэг:
def файл_унших(нэр):
try:
with open(нэр, "r", encoding="utf-8") as файл:
агуулга = файл.read()
print(агуулга)
except FileNotFoundError:
print(f"Алдаа: '{нэр}' файл олдсонгүй")
except PermissionError:
print(f"Алдаа: '{нэр}' файлыг нээх эрх байхгүй")
файл_унших("байхгүй_файл.txt")
# Алдаа: 'байхгүй_файл.txt' файл олдсонгүй
Өөрийн Exception үүсгэх
Томоохон программд өөрийн алдааны төрлийг тодорхойлж болно:
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 зохицуулах аргуудыг үзнэ.