Debugowanie skryptów
System skryptów w Altium Designer oferuje w pełni funkcjonalne środowisko debugowania. Debugger skryptów pomaga identyfikować i usuwać błędy w skryptach, udostępniając zestaw zautomatyzowanych narzędzi oraz panele informacyjne.
Błędy skryptu
Do typowych błędów należą nieprawidłowe metody, źle umieszczone operatory grupowania, niezgodne typy, błędy logiki oraz literówki. Gdy system skryptów napotka błąd, debugger wstrzyma skrypt i wyświetli okno dialogowe błędu wskazujące problem.
Poniższy przykład pokazuje skrypt z brakującym znakiem kończącym oraz odpowiadający mu komunikat w oknie dialogowym błędu.
Debugger wstrzyma skrypt w odpowiedzi na błędy kompilacji lub błędy czasu wykonania.
Po zamknięciu okna dialogowego błędu kod można poprawić i ponownie uruchomić skrypt. Jeśli skrypt trzeba zatrzymać – na przykład podczas przechodzenia krok po kroku – użyj polecenia Stop (Run » Stop, Ctrl+F3) lub przycisku na pasku narzędzi Script Debug).
Debugowanie skryptu
W systemie skryptów dostępny jest zestaw narzędzi pomagających w debugowaniu skryptów. Obejmują one m.in. ustawianie wielu punktów przerwania w skrypcie, użycie panelu Watch List do monitorowania wartości zmiennych, korzystanie z zakładek w celu sprawniejszego poruszania się oraz funkcje „krok do” i „krok przez”, aby śledzić przebieg skryptów.
Na przykład podczas sprawdzania wartości zmiennych i wyrażeń w skrypcie można użyć następujących funkcji:
- Punkty przerwania
- Podpowiedzi narzędzia oceny wyrażeń
- Podpowiedzi Insight
- Okno dialogowe Evaluate
- Watch Expressions
► Zobacz Script Editor Tools, aby uzyskać informacje o korzystaniu z narzędzi edytora podczas debugowania skryptów.
Śledzenie (Tracing)
Aby pomóc w znalezieniu i usunięciu nieznanego błędu w skrypcie, można wstawić do skryptu serię punktów przerwania, aby wstrzymywać kod w wielu miejscach i sprawdzać wartości zmiennych oraz wyrażeń.
W dowolnym momencie, gdy skrypt jest wstrzymany, można go także przesuwać o jedną funkcjonalną linię naraz, korzystając z funkcji śledzenia/kroków debuggera. W ten sposób punkt przerwania może posłużyć do wstępnego zatrzymania skryptu w interesującym obszarze, a następnie można przechodzić linia po linii przy użyciu funkcji śledzenia. Proces wykonywania skryptu linia po linii nazywa się śledzeniem (tracing) lub przechodzeniem krokowym (script stepping).
Debugger skryptów udostępnia polecenia związane ze śledzeniem – krok do (Run » Step Into) oraz krok przez (Run » Step Over). Pozwala to śledzić przebieg skryptu i analizować jego zachowanie podczas debugowania kodu skryptu.

Polecenia debugowania dostępne w Run menu.
Polecenie Step Into
Proces Step Into wykonuje skrypt, uruchamiając po jednym instrukcji naraz. Polecenie jest dostępne z Run menu, z powiązanego przycisku na pasku narzędzi Script Debug lub za pomocą F7 skrótu klawiszowego.
Jeśli wykonywana instrukcja wywołuje inną procedurę, wejście w tę instrukcję przenosi sterowanie do pierwszej linii w wywołanej procedurze. Podświetlenie w kolorze groszkowej zieleni w edytorze wskazuje linię kodu, na której aktualnie znajduje się skrypt. Proces przechodzenia krokowego skryptu można anulować poleceniem Run » Stop, skrótem Ctrl+F3 lub przyciskiem na pasku narzędzi

Polecenie Step Over
Proces Step Over jest podobny do Step Into, z tą różnicą, że jeśli bieżąca instrukcja jest wywołaniem innej procedury, cała wywołana procedura zostanie wykonana bez zatrzymywania, zamiast śledzenia jej krok po kroku. Polecenie jest dostępne z Run menu, z powiązanego przycisku lub za pomocą F8 skrótu klawiszowego.
To polecenie jest przydatne, gdy ustalono, że dana called procedura nie jest przyczyną problemu w bieżącej procedurze, i pozwala uniknąć niepotrzebnego śledzenia wywołanej procedury linia po linii – ta procedura jest „przeskakiwana” (stepped over).
Panel Call Stack
Panel Call Stack służy do wyświetlania łańcucha procedur i funkcji, które doprowadziły do bieżącego punktu wykonania w debugowanym skrypcie.

Panel Call Stack
Podczas debugowania krokowego skryptu panel będzie pokazywał nazwę każdej funkcji lub procedury, do której wchodzisz.
Gdy napotkane zostanie wywołanie innej funkcji lub procedury, panel pokaże nazwę tej dodatkowej funkcji/procedury w momencie wejścia do niej. Ponieważ funkcja/procedura jest wywoływana z wnętrza innej funkcji/procedury, pierwotna funkcja/procedura nadal jest wyświetlana w panelu.
W efekcie tworzony jest „stos wywołań” (call stack), pokazujący relacje pomiędzy kolejnymi wywołaniami funkcji/procedur potomnych. Pierwotna funkcja/procedura znajduje się na dole stosu, a każda kolejno wywołana funkcja/procedura jest umieszczana nad nią, aż do aktualnie wykonywanej funkcji/procedury na szczycie stosu.
Gdy wykonanie skryptu wychodzi z podfunkcji/podprocedury i wraca do funkcji/procedury wywołującej, ta pierwsza zostaje usunięta ze stosu, a funkcja/procedura wywołująca staje się elementem na szczycie stosu.
Dwukrotne kliknięcie wpisu w panelu spowoduje przejście do odpowiadającej mu linii skryptu, w której następuje wywołanie wybranej funkcji lub procedury. Linia zostanie podświetlona kolorem skojarzonym z błędami skryptów, a w prawym marginesie zostanie wyświetlony znacznik błędu skryptu. Służy to wyłącznie do celów wyróżnienia. Zniknie po kliknięciu w dokument i w żaden sposób nie wpływa na sesję debugowania.
Wyjątki i komunikaty
Jak to zwykle bywa w przypadku wszystkich projektów programistycznych, tworzenie i debugowanie kodu skryptu niekoniecznie kończy się na „działającym” skrypcie. W praktycznym użyciu skrypt prawdopodobnie napotka nieprzewidziane błędy lub może nie dostarczać oczekiwanych rezultatów.
Na szczęście istnieje kilka sposobów wykorzystania systemu skryptów do obsługi wyjątków wykonania oraz przekazywania użytkownikowi informacji zwrotnej o działaniu skryptu.
Obsługa wyjątków
W DelphiScript słowo kluczowe try wprowadza instrukcję try-except lub instrukcję try-finally. Te dwie instrukcje są powiązane, ale służą różnym celom.
Try Finally
W obsłudze Try-Finally instrukcje w bloku finally są zawsze wykonywane – niezależnie od tego, czy w bloku try wystąpił błąd wyjątku. Użyj bloku try-finally, aby zwolnić obiekty tymczasowe lub inne zasoby oraz wykonać czynności porządkowe.
Reset(F);
Try
// process file F
Finally
CloseFile(F);
End;
Try Except
Użyj instrukcji Try-Except, aby przechwytywać zgłaszane wyjątki i wykonywać powiązany kod obsługi błędów. Na przykład można przechwycić konkretny wyjątek i zaktualizować log lub otworzyć opisowe okno dialogowe błędu. Wyjątek w bloku try powoduje wykonanie bloku except.
W poniższym przykładzie procedura ApplyOffset jest wywoływana z odpowiednimi parametrami z procedury DefineOffset. Procedura wykonuje proste obliczenie dzielenia (na zmiennych Ydim i Zdim ) i zgłasza wynik (Offset) w standardowym oknie dialogowym.
Procedure ApplyOffset(Ydim, Zdim);
Var
Offset;
Begin;
Try
Offset := Ydim div Zdim;
ShowInfo('Calculated Offset = ' + IntToStr(Offset));
Except
ShowWarning('Entered Z dimension must be greater than zero.');
End;
End;
Procedure DefineOffset;
Begin;
ApplyOffset(32, 4);
End;
Dla parametrów ApplyOffset pokazanych powyżej (32,4) wykonany skrypt wyświetli obliczony wynik przy użyciu procedury ShowMessage, jak pokazano poniżej.

Alternatywnie, zmiana przekazywanych parametrów na 32,0 (ApplyOffset(32, 0);) wywołuje wyjątek dzielenia przez zero w obliczeniu Offset, uruchamiając blok obsługi Except. Wykorzystuje on procedurę ShowWarning do wyświetlenia odpowiedniego okna dialogowego Warning .

Raise
Założeniem w powyższej prostej procedurze obsługi błędów jest to, że wyjątek jest zgłaszany w odpowiedzi na błąd dzielenia przez zero, ale oznacza to, że inne typy wyjątków nie będą poprawnie raportowane przez tekst ostrzeżenia w oknie dialogowym. W tym przykładzie jest to jednak najbardziej prawdopodobny błąd wyjątku, z jakim można się spotkać.
Z punktu widzenia użytkownika pożądana jest mimo wszystko jakaś forma specyficznego wykrywania błędów. W DelphiScript nie jest obsługiwane delphi’owe słowo kluczowe On (do przechwytywania określonego typu wyjątku), ale instrukcji Raise można użyć wewnątrz bloku Except , aby ponownie zgłosić ostatni wyjątek (niezależnie od jego typu).
Try
Offset := Ydim div Zdim;
ShowInfo('Calculated Offset = ' + IntToStr(Offset));
Except
Raise;
End;
W ten sposób, gdy zasadnicza część kodu procedury znajduje się w bloku try instrukcji try-except, wszystkie wyjątki mogą być raportowane przez instrukcję Raise . Zwróć uwagę, że okno dialogowe wyjątku będzie raportować jedynie ogólne komunikaty o błędach, a nie informacje specyficzne dla skryptu.

Raise Raise można także użyć do wywołania wyjątku w odpowiedzi na konkretne testy, na przykład poprzez zastosowanie prostych instrukcji if-then lub case.
Procedure ApplyOffset(Ydim, Zdim);
Var
Offset;
Begin;
if Zdim > Ydim then
Begin;
Raise('Z dimension must be smaller than Y dimension.');
End;
Offset := Ydim div Zdim;
ShowInfo('Calculated Offset = ' + IntToStr(Offset));
End;
Tutaj, jeśli parametr Zdim z powyższego przykładu jest większy niż parametr Ydim, zgłaszany jest wyjątek (z komunikatem).

Błędy w skryptach VB
Implementacja VBScript w silniku skryptów Altium Designer ma wbudowane funkcje, które można wykorzystywać w projektach skryptów VBScript, takie jak funkcja MsgBox .
Instrukcja On Error może być używana podczas przechwytywania błędów w skryptach VB. Więcej informacji na temat przechwytywania błędów można znaleźć w dokumentacji Microsoft VBScript.
Komunikaty
Zasadniczo komunikaty są podstawowym sposobem usprawniania działania skryptu z perspektywy użytkownika.
Komunikaty mogą dostarczać alertów o wyjątkach lub wskazywać informacje o przebiegu działania i ostrzeżenia, a także mogą być wstawiane do procedur skryptu, które dotyczą danych wejściowych, obliczeń, operacji na plikach lub dowolnej procedury, w której przydatny byłby wgląd w przebieg działania.
Okna dialogowe komunikatów
Oprócz podstawowego okna dialogowego komunikatu dostępnego w systemie skryptowym (ShowMessage), dostępny jest zestaw specyficznych okien dialogowych, które zapewniają dopasowaną informację zwrotną dla użytkownika.
Obejmują one procedury komunikatów, takie jak:
- ShowError
- ShowException
- ShowInfo
- ShowWarning
- i inne..
Panel Messages
Panel Messages w Altium Designer może być przydatnym narzędziem do debugowania skryptów, ale może też służyć do prezentowania użytkownikowi bieżącego strumienia użytecznych informacji w postaci komunikatów.
Panel Messages jest obiektem Workspace Manager, do którego uzyskuje się dostęp z interfejsu Message Manager. Panel Messages może być używany w skrypcie do wyświetlania stanów zmiennych i właściwości (a także dowolnych innych danych) zarówno na potrzeby debugowania, jak i informacji zwrotnej dla użytkownika, jak pokazano w poniższym przykładzie.
Procedure CreateMessages;
var
WS : IWorkSpace;
MM : IMessagesManager;
Begin
WS := GetWorkSpace; // obtain Workspace Manager interface
MM := WS.DM_MessagesManager; // obtain Message Manager interface
MM.ClearMessages; // initialize
MM.BeginUpdate;
// add relevant messages here using MM.AddMesssage procedures
MM.EndUpdate;
WS.DM_ShowMessageView; // display messages
End;
)
)