Debugowanie oraz przechwytywanie błędów

To że w naszych programach będą pojawiać się błędy jest rzeczą normalną – ten się nie myli, kto nic nie robi. Czasem będą to błędy wynikające z naszego niedopatrzenia jak np. zwykłe literówki, a czasem wynikające z błędnego przeanalizowania problemu. W analizie tych i innych błędów pomoże nam sam REXX wraz z kilkoma funkcjami.

Przy analizie programu nieoceniona jest jego składnia oraz zawartość komentarzy. Pamiętajmy o tym, aby tworząc nasze programy, pisać zwarty oraz łatwy na odczytania kod, stosować wcięcia, wyrównania a kluczowe fragmenty poprzedzać objaśniającym je komentarzem. W przypadku dużych skryptów utrzymywanych przez kilku programistów warto na początku programu dodać log, czyli komentarz do którego każdy dokonujący zmiany będzie mógł dopisać czego ona dotyczyła oraz kiedy została wprowadzona.

<<następna część artykułupoprzednia część artykułu>>

1.Instrukcja Signal

Instrukcja Signal służy do przechwytywania błędów w kodzie programu. Aby użyć instrukcji w kodzie należy podać Signal On [rodzaj] – wpisujemy konkretny rodzaj:

  • Error – błąd zwrócony przez komendę hosta
  • Failure – ujemny błąd zwrócony przez komendę hosta
  • Halt – zewnętrzne przerwanie programu (wciśnięcie klawisza PA1)
  • Novalue – użycie niezainicjalizowanej zmiennej
  • Syntex – błędy w składni

Instrukcję Signal wyłączmy podając w kodzie Signal Off [rodzaj].

Przykład:

/*Rexx przykład wykorzystania instrukcji Signal */

/*Skrypt kopiuje zbiory*/

Signal On Error;
Signal On Novalue;
/*Przypisanie zmiennym nazwy zbiorów */
/* Zbiory powinny być wcześniej utworzone w systemie */

InDSN „IN.DATASET”;
OutDSN 
„OUT.DATASET”;

/*Alokacja zbiorów wejściowego oraz wyjściowego */
Address TSO;
/* Komenda TSO w REXX */
‚ALLOC DA(‚InDSN‚) FI(INPUT) SHR REUSE’;
‚ALLOC DA(‚OutDSN‚) FI(OUTPUT) OLD REUSE’;

Say „Odczytuje zbiór „InDSN;
‚EXECIO * DISKR INPUT (STEM line. FINIS’;

Say line.0 „rekordów przeczytałem z „InDSN;
Say „Zapisuję dane do zbioru „OutDSN;
‚EXECIO’ line.0 ‚DISKW OUTPUT (STEM line. FINIS’;

Say „Gotowe”;

‚FREE FI(INPUT OUTPUT)’;

Signal Off Error;
Signal Off Novalue
;

Exit 0

Error

Signal Off Error;Signal Off Novalue;
Say „Błąd w linii” Sigl”. RC =” rc;
Say „Kod źródłowy linii z błędem:”;
Say Sourceline(Sigl);

Exit 8

Novalue:

Signal Off Error;

Signal Off Novalue;

Address TSO „DELSTACK”;
Say ‚Nie zainicjowana zmienna, linia w kodzie=’ Sigl;
Say „Kod źródłowy linii z błędem:”;
Say Sourceline(Sigl);
Say „Nazwa zmiennej:” condition(‚D’);

Exit 8 

Przykładowy program w przypadku nie zainicjowania zmiennej zakończy swoje działania wyświetleniem na ekranie komunikatu:

Nie zainicjowana zmienna, linia w kodzie= 14
Kod źródłowy linii z błędem:
‚ALLOC DA(‚InDSN’) FI(INPUT) SHR REUSE’;

Przykład błędnego zakończenia wykonywania komend TSO:

Błąd w linii 14. RC = 12
Kod źródłowy linii z błędem:
‚ALLOC DA(‚OutDSN’) FI(INPUT) SHR REUSE’;

W przykładzie wykorzystano komendy TSO, które zostaną dokładnie omówione w kolejnej części kursu oraz specjalne funkcje diagnostyczne:

  • Sourceline() – zwraca zawartość linii kodu, specjalna zmienna Sigl zawiera nr linii w której wystąpił błąd
  • Condition() – zwraca informację w zależności od podanego argumentu (C, D, I, S)

2.Instrukcja Trace

Instrukcja Trace służy do śledzenia przebiegu wykonania programu. Można ją uruchomić podając argumenty: A, C, E, F, I, L, N, O, R, S, ?, !, +n, -n. Najbardziej użytecznymi są:

  • Trace R – wyświetla linię kodu, wraz z rezultatem interpretera
  • Trace N – wyświetla tylko błędnie przetworzone linie kodu
  • Trace O – wyłącza śledzenie

Przykład:

/*Rexx przykład instrukcji trace*/

Trace R; 

Say „Wyświetlam liczby od 1 do 5”; 

Do i=To 5

Say „i = „i;

End /* Do i=1 To 5 */

Trace O;

Exit 0

Zachęcam do uruchomienia powyższego programu i przeanalizowania wyników zwracanych przez instrukcję Trace z różnymi parametrami.

Autor: Dawid Morawiec

 

Komentarze

Brak komentarzy

The comments are closed.

Follow

Otrzymuj każdy nowy wpis na swoją skrzynkę e-mail.

Subskrybuj RSS