You are on page 1of 19

პროგრამირების საწყისები

Python
ლექცია 11: შეცდომები (exceptions) და მათი რედაქტირება;
ინსტრუქციები try-except-else-finally, raise, assert და with-as

ლიკა სვანაძე
lika.svanadze@btu.edu.ge
12.12.2020 lika.svanadze@btu.edu.ge 2
რეზერვირებული სიტყვები

12.12.2020 lika.svanadze@btu.edu.ge 3
შეცდომები

▪ პროგრამის წერის დროს ხშირად ხდება შეცდომები. იმისათვის, რომ


სრულად აღმოვფხვრათ შეცდომები და გავასწოროთ პროგრამა, უნდა
ვიცოდეთ რა ტიპის შეცდომები არსებობს და თითოეულ მათგანთან
როგორ ვიმუშაოთ.

▪ ამას გარდა, როდესაც ხდება პროგრამის გაშვება, შესაძლებელია


მომხმარებელმა ისეთი მონაცემები შეიყვანოს, რაც გამოიწვევს
სხვადასხვა ტიპის შეცდომების მოხდენას და საბოლოოდ კი
პროგრამის შეწყვეტას. შესაბამისად, მაქსიმალურად უნდა
გავითვალისწინოთ შეცდომის მოხდენის ყველა შემთხვევა (Quality
Assurance). ამისათვის არსებობს try-except კონსტრუქცია.

12.12.2020 lika.svanadze@btu.edu.ge 4
შეცდომები
Python-ში არსებობს (სულ მცირე) ორი განსხვავებული სახის შეცდომა: სინტაქსური შეცდომები (Syntax
Errors) და Exceptions.

▪ Syntax Error (Parsing Error) არის შეცდომა, რომელიც Python-ის სინტაქსის წესების დარღვევის
შედეგად წარმოიშვება.
File "test11.py", line 2
მაგალითი print("Hello" შედეგი SyntaxError: unexpected EOF while parsing

ნებისმიერ სახის შეცდომაში მითითებულია თუ რომელ ხაზზე მოხდა შეცდომა (line 2), რა ტიპის
შეცდომაა (SyntaxError) და შეცდომის აღწერა (მაგ. unexpected EOF while parsing).

▪ თუ პროგრამა სინტაქსურად სწორია, მაშინაც შესაძლებელია მოხდეს შეცდომა, რომელსაც


უწოდებენ Exception-ს. ასეთი შეცდომების გათვალისწინება და მართვა (დაჭერა) შესაძლებელია
პროგრამაში.

12.12.2020 lika.svanadze@btu.edu.ge 5
Built-in Exceptions

▪ შეცდომები Python-ში წარმოდგენილია


იერარქიის სახით Exception კლასში.

▪ შეცდომების სრული ჩამონათვალი და


დეტალური აღწერა შეგიძლიათ იხილოთ
ლინკზე:
https://docs.python.org/3/library/exceptions.html

12.12.2020 lika.svanadze@btu.edu.ge 6
Built-in Exceptions - ხშირი შეცდომები
დასახელება აღწერა
ZeroDivisionError ნულზე გაყოფის შეცდომა

NameError ობიექტის (ცვლადის) სახელი არ არის განსაზღვრული. მაგ: print(numb)

TypeError ფუნქციის ან ოპერაციის გამოყენება არასათანადო ობიექტის ტიპისთვის.


მაგ. ’2’+ 2 გამოსახულება გამოიწვევს შეცდომას, რადგან არ შეიძლება
სტრიქონის ტიპის მონაცემს დაემატოს რიცხვითი ტიპის მონაცემი.
IndexError ინდექსი არის საჭირო დიაპაზონის გარეთ. მაგ:
s="Hello"
print(s[8]) #სტრიქონში არის მხოლოდ 5 სიმბოლო
ValueError ოპერანდი ან ფუნქციის არგუმენტის ტიპი არის სწორი, თუმცა მისი
მნიშვნელობა არ არის შესაფერისი. მაგ. სტრიქონის მთელ რიცხვად
გარდასაქმნელად გამოიყენება ფუნქცია int() რომელსაც არგუმენტად
უნდა გადავცეთ სტრიქონი.
k=int("12") - გამოსახულებაში არ არის შეცდომა
k=int("ab") - გამოსახულებაში არის ValueError. მიუხედავად იმისა
რომ არგუმენტი არის string ტიპის, მისი მნიშვნელობის გარდაქმა მთელ
რიცხვში ვერ ხერხდება
IndentationError Tab-ით არასწორად აბზაცის გაკეთება (შეწევა/გამოწევა), ზედმეტი
სივრცეები (space)

12.12.2020 lika.svanadze@btu.edu.ge 7
try... except
შეცდომების თავიდან ასაცილებლად გამოიყენება try...except კონსტრუქცია.

try:
a = input("Input the first number")
b = input("Input the second number")
k=int(a)/int(b)
except:
print("There is an Error")

▪ თავდაპირველად სრულდება try ბლოკში მოთავსებული ბრძანებები. თუ


ამ ბლოკში მოხდა შეცდომა, პროგრამა გადადის ავტომატურად except
ბლოკში (არ აქვს მნიშვნელობა რა ტიპის შეცდომაა) და შეცდომის
გამოტანის ნაცვლად სრულდება except ბლოკის ოპერაციები.
▪ თუ try ბლოკში არ მოხდა შეცდომა, შესაბამისად არ გადადის except
ბლოკში, შესრულდება ყველა ოპერაცია რაც try ბლოკშია და გადადის try...
except ბლოკის შემდეგ (გარეთ) არსებულ ოპერაციებზე.

12.12.2020 lika.svanadze@btu.edu.ge 8
try... except კონკრეტული ტიპის შეცდომისთვის (1)

▪ იმ შემთხვევაში თუ გვსურს კონკრეტული შეცდომისთვის შესაბამისი


მოქმედებები შევასრულოთ, except-ის შემდეგ უნდა მივუთითოთ შეცდომის
დასახელება:
try:
a = input("Input the first number")
b = input("Input the second number")
k=int(a)/int(b)
except ZeroDivisionError:
print("Number is divided by zero")

▪ სხვადასხვა ტიპის შეცდომის მართვისთვის შესაძლოა გვქონდეს შესაბამისი


except ბლოკი.
try:
a = input("Input the first number")
b = input("Input the second number")
k=int(a)/int(b)
except ZeroDivisionError:
print("Number is divided by zero")
except ValueError:
print("There is Value error")
except: ყველა სხვა დანარჩენი შეცდომებისთვის
print("Any other Errors")

12.12.2020 lika.svanadze@btu.edu.ge 9
try... except კონკრეტული ტიპის შეცდომისთვის (2)
▪ კონკრეტული except ბლოკი შეიძლება შესრულდეს არა მხოლოდ ერთი
კონკრეტული ტიპის შეცდომისთვის, ასევე რამდენიმე სხვადასხვა ტიპის
შეცდომისთვის. ამისათვის სასურველი ტიპის შეცდომების დასახელებები
უნდა მივუთითოთ შემდეგნაირად:
try:
a = input("Input the first number")
b = input("Input the second number")
k=int(a)/int(b)
except (ZeroDivisionError,ValueError):
print("Number is divided by zero")

12.12.2020 lika.svanadze@btu.edu.ge 10
try... except კონკრეტული ტიპის შეცდომისთვის (3)

▪ შეცდომის მოხდენისას პროგრამაში იბეჭდება: შეცდომის დასახელება (Error


Name) და შეცდომის აღწერა(Error message).

მაგალითი print('2'+2) შედეგი


File "L11.py", line 140, in <module> print('2'+2)
TypeError: can only concatenate str (not "int") to str

შეცდომის დასახელება შეცდომის აღწერა


Error Name Error Message

▪ try... except ბლოკის დაწერისას, შესაძლოა გვინდოდეს Error Message-ზე


წვდომა, რაც შემდეგნაირად ხორციელდება:

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


შედეგი
print('2'+2)
except TypeError as a:
print(a)

12.12.2020 lika.svanadze@btu.edu.ge 11
try... except... else
▪ try ... except კონსტრუქციას შესაძლოა ქონდეს else ბლოკი.

try:
a = input("Input the number")
k = 10/int(a)
except:
print("zero division")
else:
print("This text will appear if there is no error")

▪ else ბლოკში არსებული ოპერაციები შესრულდება მხოლოდ მაშინ, თუ try


ბლოკში არ მოხდება შეცდომა. შედეგად, შესრულდება try ბლოკიც და else
ბლოკშიც არსებული ბრძანებები.

12.12.2020 lika.svanadze@btu.edu.ge 12
try... except... finally ან try.... finally
▪ try კონსტრუქციას შესაძლოა ქონდეს ასევე finally ბლოკი.

try:
a = input("Input the number")
k = 10/int(a)
except:
print("zero division")
finally:
print("It will always print")

▪ finally ბლოკში არსებული ოპერაციები შესრულდება ნებისმიერ შემთხვევაში,


მიუხედავად იმისა მოხდება თუ არა შეცდომა try ბლოკში.
▪ ძირითადად finally ბლოკში სრულდება ფაილის დახურვის ოპერაცია,
მონაცემთა ბაზასთან კავშირის შეწყვეტა.

12.12.2020 lika.svanadze@btu.edu.ge 13
შეცდომის გამოსროლა - raise
• პროგრამაში შესაძლო დაგვჭირდეს შეცდომის გამოსროლა (წარმოქმნა), რომელიც ხორციელდება
raise ოპერაციით. უმეტესად შეცდომის გამოსროლა გვჭირდება მაშინ როდესაც გვსურს საკუთარი
(custom) შეცდომის (და არა built-in Exception-ის) გამოსროლა, თუმცა ასევე შეგვიძლია გამოვიყენოთ
არსებული built-in შეცდომების გამოსროლის მიზნით.
try:
შედეგი Error
a=5
b=0
if (b==0): raise ZeroDivisionError
except:
print("Error")

• შესაძლებელია შეცდომის გამოსროლისას არგუმენტად გადაეცეს შეცდომის კონკრეტული მესიჯი:


try:
შედეგი
a=5
b=0
Number is divided by Zero
if (b==0):
raise ZeroDivisionError("Number is divided by Zero")
except ZeroDivisionError as m:
print(m)
• საკუთარი შეცდომის გამოსროლისთვის შეგვიძლია გამოვიყენოთ შემდეგი ოპერაცია:
raise Exception("message")

12.12.2020 lika.svanadze@btu.edu.ge 14
assert (1)
• assert ბრძანება ამოწმებს პირობას. თუ პირობა ჭეშმარიტია აგრძელებს მის შემდეგ
დაწერილ ბრძანებებს, თუ პირობა მცდარია, პროგრამა წყვეტს მუშაობას და
გამოისვრის AssertionError-ს.

• assert უმეტესად გამოიყენება დებაგირების პროცესში.


• assert-ს აქვს შემდეგი სახის სტრუქტურა:

assert <condition>

ან

assert <condition>, <error message>

12.12.2020 lika.svanadze@btu.edu.ge 15
assert (2)
მაგალითი 1 შედეგი

def avg(numbers):
assert len(numbers) != 0
Average value is: 6.0
return sum(numbers)/len(numbers)
AssertionError

t = [4, 7, 5, 8]
print("Average value is: ",avg(t))

t = []
print("Average value is: ",avg(t))

მაგალითი 2 შედეგი

def avg(numbers):
assert len(numbers) != 0, "List is empty"
return sum(numbers)/len(numbers) Average value is: 6.0
AssertionError: List is empty

t = [4, 7, 5, 8]
print("Average value is: ",avg(t))

t = []
print("Average value is: ",avg(t))

12.12.2020 lika.svanadze@btu.edu.ge 16
with... as
• ფაილებთან დამთავრების შემდეგ აუცილებელია გახსნილი ფაილის დახურვა, რომ
თავიდან ავიცილოთ შემთხვევით მისი დაზიანება (ინფორმაციიის რედაქტირება,
წაშლა). ასევე, ფაილის დახურვა მიზანშეწონილია რესურსების გათავისუფლების
მიზნით. ფაილის დახურვა ხდება close() მეთოდის გამოყენებით.
• with... as კონსტრუქციით ფაილის გახსნის შემთხვევაში ფაილის დახურვის ბრძანების
დაწერა საჭირო აღარ არის, რადგან with ბლოკიდან გარეთ გამოსვლის შემთხვევაში
(indent-ის მოხსნისას), ავტომატურად ფაილი არის დახურულ მდგომარეობაში.

f = open('data.txt', 'r')
with open('data.txt', 'r') as f:
content=f.read()
content=f.read() იგივეა რაც print(content)
print(content)
f.close()

12.12.2020 lika.svanadze@btu.edu.ge 17
სავარჯიშოები
1. დაწერეთ პროგრამა, სადაც მომხარებელს შემოაყვანინებთ 2 რიცხვს. დაბეჭდეთ პირველი რიცხვის მეორეზე
გაყოფის შედეგი. გაითვალისწინეთ შეცდომის მოხდენის შემთხვევები, თუ მომხარებელი არასწორ მონაცემებს
შემოიყვანს, გამოუტანოს შესაბამისი შეტყობინება და ხელახლა მისცეს შესაძლებლობა რომ კიდევ შემოიტანოს
რიცხვები. პროგრამა დასრულდეს მხოლოდ მაშინ, თუ მომხმარებელი ვალიდურ მონაცემებს შემოიტანს.
2. დაწერეთ ფუნქცია, რომელსაც პარამეტრად გადაეცემა ორი რიცხვი. თუ პირველი რიცხვი იყოფა მეორეზე,
ფუნქციამ დააბრუნოს განაყოფი. ხოლო თუ შეცდომა ფიქსირდება, ფუნქციამ დააბრუნოს შესაბამისი მნიშვნელობა.
გამოიძახეთ ფუნქცია ნებისმიერი რიცხვებისთვის და შეამოწმეთ თქვენი პროგრამის სისწორე. მითითება: try..except
ბლოკი უნდა ჩაწეროთ ფუნქციის აღწერაში.
3. დაწერეთ პროგრამა, სადაც გაითვალისწინებთ IndexError შეცდომას.
4. გახსენით myresult.txt ფაილი წაკითხვის რეჟიმში. თუ ფაილი არ არსებობს მოხდება შეცდომა. გაითვალისწინეთ
შეცდომის სახელი და დაწერეთ შესაბამისი შეტყობინება შეცდომის შესახებ (try except-ის მეშვეობით).
5. შეიტანეთ ნებისმიერი a, b, c რიცხვები, რომლებიც წარმოადგენს კვადრატული განტოლების კოეფიციენტებს:
ax2+bx+c=0 იპოვეთ კვადრატული განტოლების ფესვები. დააკვირდით რა სახის შეცდომები შესაძლოა მოხდეს და
მოახდინეთ შესაძლო შეცდომების დაჭერა try... except ბლოკით.
6. შეიყვანეთ 3 მთელი რიცხვი. თუ ეს რიცხვები აკმაყოფილებენ სამკუთხედის გვერდების სიგრძეების წესს
(სამკუთხედის ნებისმიერი ორი გვერდის სიგრძის ჯამი მესამე გვერდის სიგრძეზე მეტია), მაშინ დაბეჭდეთ მათი
საშუალო არითმეტიკული. წინააღმდეგ შემთხვევაში, გამოისროლეთ შეცდომა (raise) შესაბამისი შეტყობინებით.
შენიშვნა: თავდაპირველად წაიკითხეთ სლაიდი raise ოპერატორის შესახებ.

12.12.2020 lika.svanadze@btu.edu.ge 18
დამატებითი ლიტერატურა
1. Errors and Exceptions https://docs.python.org/3/tutorial/errors.html

12.12.2020 lika.svanadze@btu.edu.ge 19

You might also like