Ачааллж байна...
Курс 1-д та алдааг БАРЬЖ сурсан:
python
try:
too = int(input("Тоо: "))
except ValueError:
print("Тэр нь тоо биш байна")Тэр үед алдаа нь ХАА НЭГТЭЭ-ЭЭС ирдэг байсан — Python -оос, int() -ээс, файлаас. Та зөвхөн хүлээж авагч байсан.
Одоо та алдааг ҮҮСГЭГЧ болно.
Тэр үйлдлийг raise гэж нэрлэдэг. Тэр нь "энэ бол АЛДАА, программыг зогсоо" гэж хэлэх арга юм.
Мөн та өөрийн алдааны төрөл үүсгэж сурна. Тэр нь эхэндээ хачирхалтай санагдана — гэвч та түүнийг АЛЬ ХЭДИЙН ашигласан.
Бүлэг 12.4-ийн цаг агаарын программыг санаж байна уу?
python
class ApiAlda(Exception):
"""API-тай холбоотой алдаа."""Тэр үед би "Бүлэг 13.2-т бүрэн үзнэ" гэж хэлсэн. Одоо тэр цаг ирлээ.
Энэ хичээлийн төгсгөлд та raise хэзээ ашиглах, None буцаахаас хэзээ дээр байх, өөрийн exception яагаад САЛГАЛТЫГ хамгаалдгийг ойлгоно.
Асуудлыг эхнээс нь харъя.
Та функц бичиж байна: хэрэглэгчийн насыг шалгана.
python
def nas_shalgakh(nas: int) -> bool:
if nas < 0:
# Юу хийх вэ?
...
if nas > 150:
# Юу хийх вэ?
...
return TrueХэрэв нас нь -5 бол — тэр нь БУРУУ. Хүн сөрөг настай байж чадахгүй.
Тэгвэл функц юу хийх ёстой вэ?
Хариулт 1: False буцаах.
python
def nas_shalgakh(nas: int) -> bool:
if nas < 0 or nas > 150:
return False
return TrueАсуудал: дуудагч нь ЯАГААД буруу болохыг мэдэхгүй. Сөрөг үү? Хэт их үү? Тэр нь зөвхөн "буруу" гэдгийг мэднэ.
Мөн дуудагч нь шалгахаа МАРТАЖ болно:
python
nas_shalgakh(-5) # үр дүнг үл тоомсорлолоо
print("Бүртгэл амжилттай") # ХУДАЛ!Программ АЖИЛЛАЖ БАЙНА, гэхдээ БУРУУ.
Хариулт 2: None буцаах.
python
def nas_boloviruulakh(nas: int) -> int | None:
if nas < 0 or nas > 150:
return None
return nasИжил асуудал: дуудагч шалгахаа мартаж болно. Дараа нь None нь гүн рүү урсаж, ХОЛ ЗАЙД AttributeError үүсгэнэ (Бүлэг 4.3-ын сургамж).
Хариулт 3: raise — АЛДАА ГАРГАХ.
python
def nas_shalgakh(nas: int) -> int:
if nas < 0:
raise ValueError(f"Нас сөрөг байж болохгүй: {nas}")
if nas > 150:
raise ValueError(f"Нас хэт их байна: {nas}")
return nasОдоо алдааг АЛГАСАХ БОЛОМЖГҮЙ.
python
nas_shalgakh(-5)Traceback (most recent call last):
File "main.py", line 8, in <module>
nas_shalgakh(-5)
File "main.py", line 3, in nas_shalgakh
raise ValueError(f"Нас сөрөг байж болохгүй: {nas}")
ValueError: Нас сөрөг байж болохгүй: -5Программ ЗОГСЛОО. Тодорхой мессежтэй. Яг ХААНА, ЯАГААД гэдгийг хэлж байна.
Ялгааг ойлгуулах зүйрлэл.
return None бол ШОШГО. "Анхаар: энэ хайрцаг хоосон байж болно."
Ажилчин түүнийг харж болно. Эсвэл харахгүй байж болно. Хэрэв тэр анхаарахгүй бол — асуудал үүснэ, гэхдээ ХОЖИМ, ХОЛ ЗАЙД.
raise бол ТҮГЖЭЭ. "Энэ хаалга ХААЛТТАЙ. Та цааш явж ЧАДАХГҮЙ."
Ажилчин түүнийг АЛГАСАХ БОЛОМЖГҮЙ. Тэр нь ТЭР ДОР НЬ зогсоно.
Бүлэг 4.1-ийн type hint-тэй харьцуулъя:
"Type hint бол түгжээ БИШ, зөвхөн ШОШГО."
raise бол ЖИНХЭНЭ ТҮГЖЭЭ. Тэр нь албадан ажилладаг.
raise -ийн бичлэгpython
raise ValueError("Мессеж энд")Гурван хэсэг:
raise — түлхүүр үг
Алдааны ТӨРӨЛ — ValueError, TypeError гэх мэт
Мессеж — юу буруу болсныг тайлбарлана
Мессеж нь ЗААВАЛ биш, гэхдээ түүнгүйгээр алдаа нь ашиггүй:
python
raise ValueError # мессежгүй — МУУ
raise ValueError("Нас сөрөг байна") # мессежтэй — САЙНДүрэм: ҮРГЭЛЖ тодорхой мессеж бич. Утга нь ч бас оруул:
python
raise ValueError(f"Нас сөрөг байж болохгүй: {nas}")Дараа нь дебаг хийхэд та ЯМАР утга асуудал үүсгэснийг шууд харна.
Python-д олон built-in алдаа байдаг. Хамгийн түгээмэл нь:
ValueError — утга нь буруу.
python
if nas < 0:
raise ValueError(f"Нас сөрөг байж болохгүй: {nas}")Төрөл нь ЗӨВ (тоо), гэхдээ УТГА нь буруу.
Хамгийн түгээмэл, хамгийн ашигтай.
TypeError — төрөл нь буруу.
python
if not isinstance(nas, int):
raise TypeError(f"Нас нь бүхэл тоо байх ёстой, {type(nas).__name__} ирлээ")KeyError — key байхгүй (dictionary).
IndexError — index хүрээнээс гарсан (list).
FileNotFoundError — файл олдсонгүй.
ZeroDivisionError — тэгд хуваасан.
Практик дүрэм:
Утга буруу → ValueError (95% тохиолдолд)
Төрөл буруу → TypeError
Бусад → тохирох built-in олох, эсвэл өөрийн exception үүсгэх
Бүлэг 9.2-т бид __post_init__ -д raise ашигласан:
python
from dataclasses import dataclass
@dataclass(frozen=True)
class Zarlaga:
ner: str
dun: int
angilal: str = "бусад"
def __post_init__(self) -> None:
if not self.ner.strip():
raise ValueError("Нэр хоосон байж болохгүй")
if self.dun <= 0:
raise ValueError(f"Дүн эерэг байх ёстой, {self.dun} ирлээ")
z1 = Zarlaga("Ном", 15000)
print(z1)
z2 = Zarlaga("", 15000)Zarlaga(ner='Ном', dun=15000, angilal='бусад')
Traceback (most recent call last):
...
ValueError: Нэр хоосон байж болохгүйХҮЧИНГҮЙ ОБЪЕКТ ОГТ ҮҮСЭХГҮЙ.
Бүлэг 9.2-ын дүрэм:
"Хүчингүй төлөвтэй объект оршин байх ЁСГҮЙ. Хэрэв өгөгдөл нь буруу бол — объект үүсэх ёсгүй."
raise нь тэр дүрмийг АЛБАДАН хэрэгжүүлдэг.
Хэрэв return None ашигласан бол — __post_init__ нь юу ч буцааж чадахгүй (тэр нь -> None). Тиймээс raise нь ЦОРЫН ГАНЦ арга.
Одоо гол сэдэв рүү орно.
Заримдаа built-in алдаанууд ХАНГАЛТГҮЙ байдаг.
Жишээ нь номын сангийн систем (Бүлэг 9.4). Тэнд олон төрлийн алдаа гарч болно:
Ном олдсонгүй
Ном аль хэдийн зээлэгдсэн
Гишүүн олдсонгүй
Гишүүн хэт олон ном зээлсэн
Эдгээрийг бүгдийг ValueError гэж нэрлэвэл — ялгах боломжгүй.
python
try:
san.zeeldekh("N001", 1001)
except ValueError as alda:
# Аль алдаа вэ?? Ном олдоогүй юу? Зээлэгдсэн үү?
print(alda)Мессежийг УНШИЖ ялгах хэрэгтэй болно. Тэр нь эмзэг — хэрэв мессеж өөрчлөгдвөл код эвдэрнэ.
Шийдэл: өөрийн exception class үүсгэх.
python
class NomiinSanAlda(Exception):
"""Номын сангийн бүх алдааны эцэг."""
class ZuilOldsongui(NomiinSanAlda):
"""Тухайн ID -тай зүйл олдсонгүй."""
class GishuunOldsongui(NomiinSanAlda):
"""Тухайн ID -тай гишүүн олдсонгүй."""
class AlKhediinZeeldsen(NomiinSanAlda):
"""Зүйл аль хэдийн зээлэгдсэн байна."""
class KhyazgaarKhetersen(NomiinSanAlda):
"""Гишүүн зээлийн хязгаарт хүрсэн."""ТЭР Л БОЛОО.
Бүх class нь ХООСОН. Зөвхөн docstring (гурван хашилтанд байгаа тайлбар).
Гурван зүйлийг анзаараарай.
1. Exception -ээс ӨВЛӨЖ байна (Бүлэг 7.1-ийн inheritance).
Тэр нь ЗААВАЛ. Python нь зөвхөн Exception -ээс өвлөсөн class -ыг л raise хийхийг зөвшөөрдөг.
2. NomiinSanAlda нь ЭЦЭГ class. Бусад нь түүнээс өвлөж байна.
Яагаад? Учир нь ингэснээр та БҮГДИЙГ нэг дор барьж чадна:
python
try:
san.zeeldekh("N001", 1001)
except NomiinSanAlda as alda: # БҮХ номын сангийн алдаа
print(f"Алдаа: {alda}")Бүлэг 7.1-ийн polymorphism! Эцэг class -ыг барихад БҮХ хүү class баригдана.
3. Class-ууд нь ХООСОН. Ямар ч method, ямар ч талбар хэрэггүй.
Тэдгээрийн ЦОРЫН ГАНЦ зорилго нь — НЭР ӨГӨХ. Тэр нэр нь "юу буруу болсон" гэдгийг хэлдэг.
python
class NomiinSanAlda(Exception):
"""Номын сангийн бүх алдааны эцэг."""
class ZuilOldsongui(NomiinSanAlda):
"""Тухайн ID -тай зүйл олдсонгүй."""
class AlKhediinZeeldsen(NomiinSanAlda):
"""Зүйл аль хэдийн зээлэгдсэн байна."""
class GishuunOldsongui(NomiinSanAlda):
"""Тухайн ID -тай гишүүн олдсонгүй."""
class NomiinSan:
def __init__(self) -> None:
self.zuiluud: dict[str, dict] = {}
self.gishuud: dict[int, str] = {}
def zuil_nemekh(self, id: str, garchig: str) -> None:
self.zuiluud[id] = {"garchig": garchig, "zeeldsen": None}
def gishuun_nemekh(self, id: int, ner: str) -> None:
self.gishuud[id] = ner
def zeeldekh(self, zuiliin_id: str, gishuunii_id: int) -> None:
zuil = self.zuiluud.get(zuiliin_id)
if zuil is None:
raise ZuilOldsongui(f"'{zuiliin_id}' ID -тай зүйл олдсонгүй.")
gishuun = self.gishuud.get(gishuunii_id)
if gishuun is None:
raise GishuunOldsongui(f"{gishuunii_id} ID -тай гишүүн олдсонгүй.")
if zuil["zeeldsen"] is not None:
raise AlKhediinZeeldsen(
f"'{zuil['garchig']}' аль хэдийн зээлэгдсэн байна."
)
zuil["zeeldsen"] = gishuunii_id
print(f"{gishuun} — '{zuil['garchig']}' -ыг зээллээ.")Одоо туршъя:
python
san = NomiinSan()
san.zuil_nemekh("N001", "Монголын нууц товчоо")
san.gishuun_nemekh(1001, "Болд")
san.gishuun_nemekh(1002, "Сараа")
# 1. Амжилттай
san.zeeldekh("N001", 1001)
# 2. Аль хэдийн зээлэгдсэн
try:
san.zeeldekh("N001", 1002)
except AlKhediinZeeldsen as alda:
print(f"[Зээлэгдсэн] {alda}")
# 3. Зүйл олдсонгүй
try:
san.zeeldekh("N999", 1001)
except ZuilOldsongui as alda:
print(f"[Олдсонгүй] {alda}")
# 4. Гишүүн олдсонгүй
try:
san.zeeldekh("N001", 9999)
except GishuunOldsongui as alda:
print(f"[Гишүүн] {alda}")Болд — 'Монголын нууц товчоо' -ыг зээллээ.
[Зээлэгдсэн] 'Монголын нууц товчоо' аль хэдийн зээлэгдсэн байна.
[Олдсонгүй] 'N999' ID -тай зүйл олдсонгүй.
[Гишүүн] 9999 ID -тай гишүүн олдсонгүй.Алдаа бүрийг ТУСАД НЬ барьж, ӨӨР ӨӨР хариу үйлдэл үзүүлж байна.
Эсвэл БҮГДИЙГ нэг дор:
python
try:
san.zeeldekh("N999", 1001)
except NomiinSanAlda as alda: # ЭЦЭГ class
print(f"Алдаа: {alda}")Алдаа: 'N999' ID -тай зүйл олдсонгүй.Inheritance нь уян хатан байдал өгч байна: тодорхой алдааг барих, эсвэл бүгдийг.
Одоо Бүлэг 12.4-ийн ApiAlda -г эргэн харъя.
python
# tsag_agaar/api.py
class ApiAlda(Exception):
"""API-тай холбоотой алдаа."""
def _khuselt(url: str, parametruud: dict) -> dict:
try:
hariult = requests.get(url, params=parametruud, timeout=TIMEOUT)
hariult.raise_for_status()
return hariult.json()
except requests.exceptions.HTTPError as alda:
raise ApiAlda(f"Хүсэлт буруу байна ({kod}).") from alda
except requests.exceptions.ConnectionError as alda:
raise ApiAlda("Серверт холбогдож чадсангүй.") from aldaЮу болж байна вэ?
api.py нь requests -ийн алдааг БАРЬЖ, өөрийн ApiAlda болгож ХУВИРГАЖ байна.
Тэгэхээр main.py нь requests -ыг МЭДЭХГҮЙ:
python
# main.py
from tsag_agaar import ApiAlda, medee_avakh # requests БАЙХГҮЙ!
try:
medee = medee_avakh(khot)
except ApiAlda as alda:
print(f"Алдаа: {alda}")Энэ бол САЛГАЛТ (Бүлэг 12.2).
Хэрэв ApiAlda байгаагүй бол:
python
# main.py
import requests # МУУ!
try:
medee = medee_avakh(khot)
except requests.exceptions.ConnectionError:
...
except requests.exceptions.Timeout:
...Одоо main.py нь requests -ийг МЭДЭХ болов.
Яагаад муу вэ?
Шалтгаан 1: маргааш та requests -ыг httpx (өөр HTTP сан) -ээр солихыг хүсвэл — main.py -г ч бас засах хэрэгтэй.
ApiAlda -тай бол — зөвхөн api.py -г засна. main.py НЭГ Ч мөр өөрчлөгдөхгүй.
Шалтгаан 2: main.py нь HTTP -ийн талаар мэдэх ЁСГҮЙ. Тэр нь ХЭРЭГЛЭГЧТЭЙ ярих ажилтай.
Дүрэм: ГАДНЫ САНГИЙН алдааг ӨӨРИЙН алдаа болгож хувирга.
Тэр нь хилийн цэг үүсгэдэг. Гадна тал нь дотоод бүтцийг мэдэхгүй.
Бүлэг 11.2-ын API зарчим дахин:
"API нь дотоод бүтцийг НУУНА."
raise ... from ... — гинжийг хадгалахДээрх кодод нэг сонирхолтой бичлэг байна:
python
raise ApiAlda("Серверт холбогдож чадсангүй.") from aldafrom alda гэдэг нь: "энэ алдаа нь ТЭР алдаанаас үүдэлтэй."
Юу өгдөг вэ? Дебаг хийхэд БҮХ гинжийг харуулна:
Traceback (most recent call last):
File "api.py", line 15, in _khuselt
hariult = requests.get(url, params=parametruud, timeout=TIMEOUT)
requests.exceptions.ConnectionError: Failed to resolve 'api.example.com'
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "main.py", line 8, in <module>
medee = medee_avakh(khot)
File "api.py", line 22, in _khuselt
raise ApiAlda("Серверт холбогдож чадсангүй.") from alda
tsag_agaar.api.ApiAlda: Серверт холбогдож чадсангүй.The above exception was the direct cause of the following exception — "дээрх алдаа нь доорхийн ШУУД ШАЛТГААН."
Хоёр алдаа хоёулаа харагдаж байна. Хэрэглэгч нь ApiAlda -г харна, гэхдээ ПРОГРАММИСТ нь жинхэнэ шалтгааныг (ConnectionError) ч бас харна.
Хэрэв from -ыг орхивол:
python
raise ApiAlda("Серверт холбогдож чадсангүй.")During handling of the above exception, another exception occurred:During handling — "өмнөх алдааг зохицуулж байхад ӨӨР алдаа гарлаа."
Тэр нь бага зэрэг ойлгомжгүй. from нь холбоог ТОДОРХОЙ болгодог.
Практик зөвлөгөө: алдааг хувиргахдаа ҮРГЭЛЖ from ашигла.
raise vs return None — хэзээ алийг ньОдоо хамгийн чухал практик асуулт.
raise ашигла:
Нөхцөл нь ГАЖИГ (буруу, гэнэтийн)
Дуудагч нь ЗАЛРУУЛАХ БОЛОМЖГҮЙ
Алдааг АЛГАСАХ ЁСГҮЙ
Объект ХҮЧИНГҮЙ төлөвт орох гэж байна
Жишээ:
Сөрөг нас → raise ValueError
Файл байх ЁСТОЙ, гэхдээ байхгүй → raise
API холбогдож чадсангүй → raise ApiAlda
Аль хэдийн зээлэгдсэн ном зээлэх → raise AlKhediinZeeldsen
return None ашигла:
"Олдсонгүй" нь ХЭВИЙН үр дүн
Дуудагч нь тэр тохиолдлыг ХҮЛЭЭЖ БАЙНА
Тэр нь алдаа БИШ
Жишээ:
dictionary.get(key) → key байхгүй нь ХЭВИЙН → None
Хайлт → олдохгүй нь ХЭВИЙН → None
Кэшээс унших → байхгүй нь ХЭВИЙН → None
Гол асуулт: тэр нь ГЭНЭТИЙН үү, эсвэл ХҮЛЭЭГДЭЖ байсан уу?
Бүлэг 12.4-ийн жишээ:
python
def khot_khaikh(ner: str) -> Khot | None:
...
ur_dun = uguudul.get("results")
if not ur_dun:
return None # "олдсонгүй" — ХЭВИЙН
return Khot.from_api(ur_dun[0])Хот олдоогүй нь ХЭВИЙН. Хэрэглэгч буруу нэр бичсэн байж болно. Тэр нь алдаа БИШ.
Гэвч:
python
def _khuselt(url: str, parametruud: dict) -> dict:
...
raise ApiAlda("Серверт холбогдож чадсангүй.") # ГАЖИГСүлжээ тасрах нь ГАЖИГ. Тэр нь алдаа. raise.
Тэр хоёр нь НЭГ файлд, зэрэгцээ байна. Учир нь тэдгээр нь ӨӨР шинжтэй асуудлууд.
except доторх raise — дахин шидэхЗаримдаа та алдааг барьж, ямар нэг зүйл хийж, дараа нь ДАХИН ШИДЭХ хүсэлтэй болно.
python
def uguudul_boloviruulakh(zam: str) -> dict:
try:
with open(zam, "r", encoding="utf-8") as f:
return json.load(f)
except json.JSONDecodeError:
print(f"АНХААР: {zam} файл эвдэрсэн байна")
raise # ДАХИН ШИДЭХ — мессежгүй!raise (аргументгүй) нь: "яг тэр алдааг ДАХИН шид."
Хэрэглээ: та алдааг ЛОГ бичих, цэвэрлэх, анхааруулах — гэхдээ түүнийг НУУХГҮЙ.
Алдааг НУУХ нь ХАМГИЙН МУУ зүйл:
python
try:
...
except Exception:
pass # АЙМШИГТАЙ!pass нь алдааг БҮРЭН НУУНА. Программ буруу ажиллана, та яагаад гэдгийг ХЭЗЭЭ Ч мэдэхгүй.
Дүрэм: except ...: pass ХЭЗЭЭ Ч бүү бич. Хамгийн багадаа лог бич:
python
except Exception as alda:
print(f"Гэнэтийн алдаа: {alda}")
raiseХэрэв сонирхвол: номын сангийн жишээг өөрөө бичиж, дөрвөн алдааг бүгдийг үүсгэж үзээрэй. Дараа нь эцэг class (NomiinSanAlda) -аар БҮГДИЙГ нэг дор барьж үзээрэй.
Мөн хүсвэл: raise ... from alda -г ашиглаад, дараа нь from -ыг УСТГААД, traceback хэрхэн өөрчлөгдөж байгааг харьцуулаарай.
Мөн хүсвэл: Бүлэг 9.4-ийн номын сангийн системд өөрийн exception -уудыг нэмээд, print("Алдаа: ...") + return False гэсэн хэв маягийг raise -ээр солиод үзээрэй. Код нь илүү цэвэрхэн болохыг мэдрэх болно.
1. Exception -ээс өвлөхөө мартах
python
class MinyAlda: # Exception БАЙХГҮЙ!
pass
raise MinyAlda("Алдаа")TypeError: exceptions must derive from BaseExceptionException -ээс ЗААВАЛ өвлө: class MinyAlda(Exception):
2. Алдааг НУУХ
python
try:
...
except Exception:
pass # АЙМШИГТАЙПрограмм чимээгүй буруу ажиллана. ХЭЗЭЭ Ч бүү хий.
3. Хэт өргөн барих
python
try:
...
except Exception: # БҮХ зүйлийг барина
print("Алдаа")Таны кодын алдаа (KeyError, TypeError) ч бас баригдана. Дараа нь та юу болсныг мэдэхгүй.
Тодорхой бари: except ValueError, except ApiAlda.
4. except -ийн дарааллыг буруу тавих
python
except NomiinSanAlda: # ЭЦЭГ — эхэнд!
...
except ZuilOldsongui: # ХЭЗЭЭ Ч ажиллахгүй
...Эцэг class нь бүгдийг барина. Тусгайг эхэнд, ерөнхийг араас (Бүлэг 11.5-ын сургамж).
5. Мессежгүй raise
python
raise ValueErrorДебаг хийхэд ямар ч мэдээлэл байхгүй. ҮРГЭЛЖ тодорхой мессеж бич, утгыг ч оруул.
6. raise -ыг return None -ий оронд ХЭТ ОЛОН ашиглах
python
def khaikh(devter: dict, ner: str) -> str:
if ner not in devter:
raise KeyError(f"'{ner}' олдсонгүй") # ХЭТ ХАТУУ?
return devter[ner]Хэрэв "олдсонгүй" нь ХЭВИЙН тохиолдол бол — return None нь илүү зөв. Гэнэтийн үү, хүлээгдэж байсан уу?
raise нь алдааг ҮҮСГЭДЭГ. Курс 1-д та барьж сурсан, одоо үүсгэж сурлаа.
Бичлэг: raise ValueError(f"Тодорхой мессеж: {utga}"). ҮРГЭЛЖ мессеж бич, утгыг ч оруул.
raise бол ТҮГЖЭЭ, return None бол ШОШГО. Түгжээг алгасах боломжгүй.
Хамгийн түгээмэл төрлүүд: ValueError (утга буруу — 95%), TypeError (төрөл буруу), KeyError, IndexError.
__post_init__ -д raise (Бүлэг 9.2) → хүчингүй объект ОГТ үүсэхгүй.
Өөрийн exception:
python
class NomiinSanAlda(Exception): # ЭЦЭГ
"""Тайлбар."""
class ZuilOldsongui(NomiinSanAlda): # ХҮҮ
"""Тайлбар."""Exception -ээс ЗААВАЛ өвлө (Бүлэг 7.1-ийн inheritance)
Class-ууд нь ХООСОН — тэдгээрийн зорилго нь НЭР ӨГӨХ
Эцэг class -ыг барихад БҮХ хүү class баригдана (polymorphism)
ГАДНЫ САНГИЙН алдааг ӨӨРИЙН алдаа болгож ХУВИРГА → САЛГАЛТ хамгаалагдана.
api.py нь requests -ийн алдааг ApiAlda болгоно
main.py нь requests -ыг МЭДЭХГҮЙ
Маргааш HTTP сангаа солиход — main.py НЭГ Ч мөр өөрчлөгдөхгүй
raise ... from alda — гинжийг хадгална. Traceback -д хоёулаа харагдана. Хувиргахдаа ҮРГЭЛЖ ашигла.
raise (аргументгүй, except дотор) — ДАХИН ШИДНЭ. Лог бичээд, нуухгүй.
raise vs return None:
ГАЖИГ, гэнэтийн, алгасах ёсгүй → raise
ХЭВИЙН, хүлээгдэж байсан ("олдсонгүй") → return None
except ...: pass ХЭЗЭЭ Ч бүү бич. Алдааг нуух нь хамгийн муу зүйл.
Дараагийн хичээлд бид with -ыг үзнэ.
Та түүнийг Курс 1-ээс эхлэн ХЭДЭН ЗУУН удаа бичсэн:
python
with open(zam, "r", encoding="utf-8") as f:
...Гэвч with яг ЮУ хийдгийг та мэдэхгүй. Тэр нь ямар нэг илбэ мэт харагддаг.
Дараагийн хичээлд бид түүнийг тайлна. Мөн та with нь try/finally -ийн богино бичлэг гэдгийг мэдэх болно — өөр илбэ байхгүй.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.