შეცდომები (Exceptions) Python-ში¶
შესავალი¶
შეცდომა (exception) არის არასაკმარისი/არელაჩვეული მდგომარეობა, რომელიც ჩნდება პროგრამის შესრულებისას და წყვეტს ნორმალურ მიმდინარეობას.
Exception-ების მართვა გვაძლევს საშუალებას პროგრამა არ ავარდეს, არამედ კონტროლირებულად იმოქმედოს.
შეცდომების ძირითადი ტიპები¶
ზოგადი, ხშირად შემხვედრი შეცდომები:
- SyntaxError – სინტაქსის შეცდომა (კომპილაციის/პარსინგის ეტაპზე)
- NameError – ცვლადი/სახელი არ არსებობს
- TypeError – ტიპები შეუთავსებელია
- ValueError – მნიშვნელობა არასწორია (ტიპი სწორი, მნიშვნელობა არა)
- IndexError – ინდექსი ფარგლებს გარეთაა
- KeyError – გასაღები არ არსებობს ლექსიკონში
- ZeroDivisionError – ნულზე გაყოფა
- FileNotFoundError – ფაილი ვერ მოიძებნა
- IOError/OSError – შესატან/გამოტან ოპერაციებზე პრობლემები
try–except¶
ძირითადი კონსტრუქცია შეცდომის დასაჭერად:
try:
risky = int(input("შეიყვანე მთელი რიცხვი: "))
print(100 / risky)
except ValueError:
print("შეყვანილი მნიშვნელობა არ არის მთელი რიცხვი.")
except ZeroDivisionError:
print("ნულზე გაყოფა დაუშვებელია.")
მრავალი ტიპის ერთთან დაჭერა¶
try–except–else–finally¶
else: შესრულდება მაშინ, როცა არ მოხდა uitzonderingfinally: შესრულდება ყოველთვის (მნიშვნელოვანია რესურსების დახურვისთვის)
try:
n = int(input("რიცხვი: "))
res = 100 / n
except (ValueError, ZeroDivisionError) as e:
print("შეცდომა:", e)
else:
print("წარმატება! შედეგი =", res)
finally:
print("ეს ბლოკი ყოველთვის სრულდება (ლოღირების/რესურსების დახურვა).")
შეცდომის მიზანმიმართული აგდება (raise)¶
def get_even(x):
if x % 2 != 0:
raise ValueError("მნიშვნელობა უნდა იყოს ლუწი.")
return x
# get_even(3) # გამოაგდებს ValueError-ს
with … as — კონტექსტ მენეჯერი¶
with უზრუნველყოფს რესურსის ავტომატურ დახურვას/გაწმენდას (ფაილები, ქსელი, lock-ები).
# ფაილის უსაფრთხო კითხვა
try:
with open("data.txt", "r", encoding="utf-8") as f:
for line in f:
print(line.strip())
except FileNotFoundError:
print("ფაილი ვერ მოიძებნა.")
კონტექსტ მენეჯერი გარანტირებულად ახურავს ფაილს, თუნდაც შუაში მოხდეს შეცდომა.
საკუთარი Exception კლასები¶
შეგიძლია განასაზღვრო დომენ-სპეციფიკური შეცდომა:
class InvalidGradeError(Exception):
"""ანიშნულის არასწორი დიაპაზონი."""
def set_grade(value):
if not (0 <= value <= 100):
raise InvalidGradeError("ქულა უნდა იყოს 0–100 დიაპაზონში.")
return value
კარგი პრაქტიკები¶
- დაიჭირე კონკრეტული შეცდომები; დიდი
except Exception:მხოლოდ ზედა დონეზე გამოიყენე ლოღირებისთვის. finallyგამოიყენე რესურსების დახურვისთვის.- ტექსტური შეტყობინებები გააკეთე მომხმარებლისთვის გასაგებად.
- არ ჩააფარო ბაგები
bare except-ით — პრობლემის დიანოსტიკა დაგიჭირდება.
ანტიპატერნები (რას მოვერიდოთ)¶
[1] პრაქტიკული დავალებები #1–#3¶
დავალება #1 — უსაფრთხო გაყოფა¶
დაწერე ფუნქცია safe_div(a, b), რომელიც აბრუნებს a/b-ს.
თუ b == 0, დააბრუნე "ნულზე გაყოფა დაუშვებელია".
def safe_div(a, b):
try:
return a / b
except ZeroDivisionError:
return "ნულზე გაყოფა დაუშვებელია"
print(safe_div(10, 2)) # 5.0
print(safe_div(10, 0)) # შეტყობინება
დავალება #2 — უსაფრთხო გარდაქმნა¶
წაიკითხე მომხმარებლის შეყვანა და აქციე int-ად.
თუ ვერ გარდაიქმნება, შეატყობინე და სთხოვე თავიდან.
def read_int(prompt="რიცხვი: "):
while True:
try:
return int(input(prompt))
except ValueError:
print("გთხოვ, შეიყვანე მთელი რიცხვი. სცადე კიდევ.")
n = read_int()
print("მიღებულია:", n)
დავალება #3 — ფაილი და with–as¶
კონტექსტ მენეჯერის გამოყენებით წაიკითხე ფაილი, რომლის სახელსაც მომხმარებელი შეიყვანს.
თუ ფაილი არ არსებობს — მოახდინე კორექტული ინფორმირება და არ დააგდი პროგრამა.
def read_file_interactive():
name = input("ფაილის სახელი: ")
try:
with open(name, "r", encoding="utf-8") as f:
print("--- ფაილის შინაარსი ---")
print(f.read())
except FileNotFoundError:
print("ფაილი ვერ მოიძებნა:", name)
read_file_interactive()
განხილვა–ანალიზი¶
try–except–else–finallyსაშუალებას გვაძლევს განვაცალკევოთ წარმატებული მიმდინარეობა, შეცდომების დამუშავება და რესურსების გაწმენდა.with–asამცირებს გაჟონვის რისკს (ფაილი/ქსელი/lock), აუმჯობესებს კოდის სისუფთავეს.- საკუთარი Exception კლასები ხელს უწყობს დომენურ ლოგიკაში მკაფიო ერორ-მენეჯმენტს.
- პრაქტიკული დავალებები აჩვენებს: პროგრამა არ უნდა ავარდეს მოსალოდნელი შეცდომების გამო — სჯობს წინასწარ განჭვრეტა და კორექტული რეაქცია.
საყოფაცხოვრებო რჩევა: ლაბებში ჩართეთ „ხარვეზების ინიაციას“ — შეგნებულად შექმენით შეცდომები (ცარიელი შეყვანა, არარსებული ფაილი, ნულზე გაყოფა) და დააკვირდით, სწორად იჭერთ თუ არა.