Аудиториска вежба 2 - finki-mk/VP GitHub Wiki

Цели на вежбата

  • Идентификување и препознавање на различни видови грешки
  • Совладување на техника на дебагирање во VS IDE
  • Исклучоци во C#

Видови на грешки

  • Синтаксички грешки
  • Compile-time errors
  • Грешки при извршување
  • Run-time errors
  • Fatal errors
  • Логички грешки
  • Грешки во начинот на извршување на програмата

Дебагирање во VS/VCE

Изврешување на два начини

  • Со дебагирање (F5)
  • Без дебагирање Debug -> Start Without Debugging, Ctrl+F5

Што овозможува извршувањето со дебагирање?

  • Прикажување информации од дебагирањето на IDE
  • Следење (и менување) на вредностите на променливите при извршувањето на апликацијата
  • Паузирање и рестартирање на извршувањето
  • Автоматско сопирање на ивршувањето во одредени точки во кодот
  • Извршување чекор по чекор на секоја линија код
  • Следење на менувањето на променливите при извршувањето на апликацијата
  • Менување на содржината на променливите при извршување
  • Извршување на тест повици на функции

Дебагирање без прекинување на извршувањето

Се сеќавате на printf

Console.WriteLine("Povikana e funkcijata doSomething().");

Outputting Debugging Information

  • Debug.WriteLine() - се извршува во Debug конфигурација
  • Trace.WriteLine() - се извршува во Debug/Release конфигурација

Дебагирање со прекинување на извршувањето

  • Паузирање на извршувањето на програмата (Pause)

    Start debugging Pause debugging

  • Breakpoints - се паузира извршувањето на програмата кога ќе се достигне оваа точка од програмата

  • Додавање на breakpoints

  • Лев клик на левиот дел линијата на која сакаме да додадеме
  • Десен клик на линијата и изберете Breakpoint -> Insert Breakpoint

Pause debugging

Следење на содржината на променливите

Наједноставен начин со поставување на покажувачот над променливата чија што содржина сакаме да ја видиме

Pointer

Постепено извршување на кодот

Steps

Во моментот кога ќе се паузира извршувањето на програмата на Breakpoint извршувањето може да продолжи на три начини:

  • Step Into (F11): Се извршува и се преминува на следната наредба.
  • Step Over (F10): Слично на Step Into, но не влегува во други блокови код како што се функциите и методите.
  • Step Out (Shift+F11): Се извршува до крајот на блокот (функција, метод) и застанува на следната наредба која следи.

Immediate и Command Windows

Immediate window

  • Овозможуваат евалуирање на C# изрази и извршување на разни команди
  • Можност за менување на вредноста на променливите преку Immediate Window

Call Stack Window

Call stack

Прикажува хиерархија на функциски повици во извршувањето на програмата.

Справување со грешки (Error Handling)

Справување со грешки (Error Handling) ги означува техниките на справување со исклучоците (exceptions) кои настануваат при извршувањето на програмата.

   int[] myArray = { 1, 2, 3, 4 };
   int myElem = myArray[4];

Извршувањето на овој сегмент код ја прикажува следнава порака за грешка:

Index was outside the bounds of the array

try. . .catch. . .finally

    try
    {
        ...
    }
    catch (<exceptionType> e)
    {
        ...
    }
    finally
    {
        ...
    }

Може да постојат и само try и finally блокови без catch блок, или пак try блок со повеќе catch блокови. Ако постојат еден или повеќе catch блокови, тогаш finally блокот е опционален, ако не тогаш е задолжителен.

  • try - Содржи код кој може да „фрли“ (throw) исклучоци (throw е клучното зборче во C# кое кажува дека се „генерира“ или се „предизвикува“ исклучок)
  • catch - Содржи код кој се извршува ако настане исклучок. catch блоковите може да одговараат исклучиво на одредени типови на исклучоци (како на пример System.IndexOutOfRangeException) преку употреба на <exceptionType>, со што и се овозможува повеќе catch блокови за различни типови на исклучоци. Исто така можно е да се изостави овој параметар и да се реагира на на сите типови на исклучоци.
  • finally - Содржи код кој се извршува секогаш, без разлика дали се случил исклучок во try блокот или пак е обработен или не исколучокот во catch блокот.

Тек на извршување

  1. try блокот прекинува на точката во која се случува исклучок.
  2. Ако постои catch блок се проверува дали типот на исклучокот кој го прима како параметар соодветствува на фрлениот исклучок. Ако не постои catch блок, тогаш мора да постои finally блок кој се извршува.
  3. Ако catch блок се совпадне со типот на исклучокот, тога се извшува кодот кој го содржи овој блок, а потоа се извршува finally блокот ако постои.
  4. Ако не постои catch блок кој соодветствува на типот на исклучокот, тогаш се извршува кодот на finally ако постои.