Professional Documents
Culture Documents
11 შედომები
11 შედომები
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
შეცდომები
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).
12.12.2020 lika.svanadze@btu.edu.ge 5
Built-in Exceptions
12.12.2020 lika.svanadze@btu.edu.ge 6
Built-in Exceptions - ხშირი შეცდომები
დასახელება აღწერა
ZeroDivisionError ნულზე გაყოფის შეცდომა
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")
12.12.2020 lika.svanadze@btu.edu.ge 8
try... except კონკრეტული ტიპის შეცდომისთვის (1)
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)
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")
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")
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")
12.12.2020 lika.svanadze@btu.edu.ge 14
assert (1)
• assert ბრძანება ამოწმებს პირობას. თუ პირობა ჭეშმარიტია აგრძელებს მის შემდეგ
დაწერილ ბრძანებებს, თუ პირობა მცდარია, პროგრამა წყვეტს მუშაობას და
გამოისვრის AssertionError-ს.
assert <condition>
ან
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