შესვლა

პროგრამირების საფუძვლები › დამწყები › შეცდომების პოვნა

შეცდომის სამი სახე

მარტივი⏱ 7 წთ+20 XP👑 Pro#შეცდომები#debugging#SyntaxError

რას ისწავლი

  • რით განსხვავდება სინტაქსური, შესრულების და ლოგიკური შეცდომა
  • როგორ ვლინდება თითოეული და რას გეუბნება კომპიუტერი
  • რატომ არის ლოგიკური შეცდომის პოვნა ყველაზე რთული

შეცდომა ნორმალურია

ყველა პროგრამისტი, დამწყებიც და ოცწლიანი გამოცდილების მქონეც, ყოველდღე უშვებს შეცდომებს. განსხვავება მხოლოდ იმაშია, რამდენად სწრაფად პოულობს მათ. პროგრამაში შეცდომას ბაგი (bug) ჰქვია, მის პოვნასა და გასწორებას კი დებაგინგი (debugging). ამ მოდულში ამ ხელობას ისწავლი.

პირველი ნაბიჯი: გაიგე, რა სახის შეცდომასთან გაქვს საქმე. სულ სამი სახე არსებობს.

1. სინტაქსური შეცდომა

სინტაქსი (syntax) ენის გრამატიკაა: სად იწერება ფრჩხილი, ბრჭყალი, მძიმე. თუ წესი დაარღვიე, კომპიუტერი კოდს ვერც კი „წაიკითხავს“:

JavaScript
console.log("ეს ხაზი სწორია");
console.log("აქ ფრჩხილი აკლია";

შედეგი: SyntaxError: missing ) after argument list, „არგუმენტების სიის შემდეგ ) აკლია“. საინტერესოა, რომ პირველი, სწორი ხაზიც არ დაიბეჭდება. JavaScript ჯერ მთელ კოდს კითხულობს და მხოლოდ მერე ასრულებს. თუ გრამატიკა სადმე დარღვეულია, არცერთი ხაზი არ სრულდება.

სინტაქსური შეცდომა ყველაზე ადვილი გასასწორებელია: კომპიუტერი გეუბნება, რომ ის არსებობს, და დაახლოებით სად. ხშირი მიზეზები: დაუხურავი ფრჩხილი ან ბრჭყალი, გამოტოვებული მძიმე, ზედმეტი სიმბოლო.

2. შესრულების შეცდომა

აქ გრამატიკა სწორია და პროგრამა იწყება, მაგრამ შესრულებისას რაღაც შეუძლებელს აწყდება: არარსებულ ცვლადს, ან undefined-ის თვისებას. ასეთ შეცდომას შესრულების შეცდომა (runtime error) ჰქვია.

JavaScript
console.log("პირველი ხაზი იმუშავებს");
let total = 50;
console.log(totl);
console.log("ეს აღარ დაიბეჭდება");

პირველი ხაზი იბეჭდება, მესამეზე კი პროგრამა ჩერდება: ReferenceError: totl is not defined. შეცდომამდე ყველაფერი სრულდება, შეცდომის შემდეგ არაფერი. ამიტომ ყოველთვის შეგიძლია გაიგო, სად გაჩერდა პროგრამა.

3. ლოგიკური შეცდომა

ყველაზე მზაკვარი. პროგრამა სრულდება ბოლომდე, შეცდომის შეტყობინება არ ჩანს, მაგრამ შედეგი არასწორია:

JavaScript
let a = 8;
let b = 10;
let average = a + b / 2;
console.log("საშუალო:", average);   // საშუალო: 13

8-ისა და 10-ის საშუალო 9-ია, პროგრამამ კი 13 დაბეჭდა: გაყოფა შეკრებამდე შესრულდა. კომპიუტერმა ზუსტად ის გააკეთა, რაც დავწერეთ, უბრალოდ დავწერეთ არა ის, რაც გვინდოდა.

ლოგიკურ შეცდომას (logic error) კომპიუტერი ვერ შეამჩნევს, რადგან არ იცის, რა გინდოდა. ამიტომ მის საპოვნელად შედეგი უნდა შეამოწმო: წინასწარ გამოთვალე მოსალოდნელი პასუხი პატარა, მარტივ მაგალითზე და შეადარე პროგრამისას. შემდეგ თავებში ისწავლი ხერხებს, რომლებიც ლოგიკური შეცდომის ზუსტ ადგილს გაჩვენებს.

სცადე თავად

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

JavaScript · სცადე თავად

ხშირი შეცდომები

  • შეცდომის შეტყობინების გამოტოვება. შეტყობინება მინიშნებაა და არა დასჯა. ყოველთვის ბოლომდე წაიკითხე.
  • „კომპიუტერი ცდება“. თითქმის არასოდეს. თუ შედეგი უცნაურია, კოდი ზუსტად იმას აკეთებს, რაც წერია. ეძებე, სად განსხვავდება დაწერილი ნაფიქრისგან.
  • შედეგის შეუმოწმებლობა. თუ შეცდომის შეტყობინება არ ჩანს, ეს არ ნიშნავს, რომ პროგრამა სწორია. პასუხი ხელით გამოთვლილს შეადარე.

სავარჯიშო

ეს კოდი 20 ლარიან ნივთზე 25%-იან ფასდაკლებას ითვლის და უნდა დაბეჭდოს ფასდაკლებით: 15. შეცდომის შეტყობინება არ ჩანს, მაგრამ შედეგი არასწორია. იპოვე და გაასწორე ლოგიკური შეცდომა.

JavaScript · სცადე თავად
💡 მინიშნება

25% პროცენტია, არა ლარი. ფასდაკლების თანხაა price * discount / 100.

✅ ამოხსნის ნახვა
JavaScript
let price = 20;
let discount = 25;
let finalPrice = price - price * discount / 100;
console.log("ფასდაკლებით:", finalPrice);

მინი-ქვიზი

1პროგრამის მეორე ხაზში ფრჩხილი აკლია. რა დაიბეჭდება?

2პროგრამა ბოლომდე სრულდება, შეცდომას არ აჩვენებს, მაგრამ პასუხი არასწორია. რა სახის შეცდომაა?

3რა ემართება ReferenceError-ის წინ დაწერილ ხაზებს?

შეჯამება

  • სინტაქსური შეცდომა: დარღვეული გრამატიკა, არცერთი ხაზი არ სრულდება.
  • შესრულების შეცდომა: პროგრამა ჩერდება იმ ხაზზე, სადაც შეუძლებელს შეეჯახა.
  • ლოგიკური შეცდომა: შეტყობინება არ არის, შედეგი არასწორია.
  • ლოგიკურს მხოლოდ შედეგის შემოწმებით იპოვი: პასუხი წინასწარ ხელით გამოთვალე.
📝 ჩემი შენიშვნა