Oto interesujący fakt: nie kod jest wolny od błędów - w rzeczywistości niektóre kody celowo pełne są „błędów”.
Co to jest błąd w aplikacji? Błąd to niepoprawnie zakodowane rozwiązanie problemu. Tacy są błędy logiczne może to prowadzić do nieprawidłowych wyników funkcji, w których wszystko wydaje się być dobrze połączone, ale wynik zastosowania jest całkowicie bezużyteczny. W przypadku błędów logicznych an podanie może przestać działać.
Wyjątki mogą obejmować błędy w kodzie, w których próbujesz podzielić liczby na zero lub próbujesz użyć zwolnionych bloków pamięci lub podać nieprawidłowe parametry funkcji. Jednak wyjątek w aplikacji nie zawsze jest błędem.
Wyjątki i klasa wyjątków
Wyjątek stanowią warunki specjalne wymagające specjalnego postępowania. Gdy wystąpi warunek typu błędu, program zgłasza wyjątek.
Ty (jako autor aplikacji) zajmiesz się wyjątkami, aby Twoja aplikacja była bardziej podatna na błędy i reagowała na wyjątkowy warunek.
W większości przypadków będziesz pisarzem aplikacji, a także pisarzem bibliotek. Musisz więc wiedzieć, jak zgłaszać wyjątki (z biblioteki) i jak sobie z nimi radzić (z aplikacji).
Artykuł na temat obsługa błędów i wyjątków zawiera kilka podstawowych wskazówek, jak chronić się przed błędami przy użyciu bloków try / else / end i try / wreszcie / end, aby reagować na wyjątkowe warunki lub radzić sobie z nimi.
Prosta próba / z wyjątkiem bloków ochronnych wygląda następująco:
próbować
ThisFunctionMightRaiseAnException ();
z wyjątkiem// obsłużyć wszelkie wyjątki zgłoszone w ThisFunctionMightRaiseAnException () tutaj
koniec;
ThisFunctionMightRaiseAnException może mieć, w swojej implementacji, wiersz kodu podobny
podnieść Wyjątek. Utwórz („warunek specjalny!”);
Wyjątek to specjalna klasa (jedna z niewielu bez litery T przed nazwą) zdefiniowana w jednostce sysutils.pas. Jednostka SysUtils definiuje kilka potomków wyjątków specjalnego przeznaczenia (i w ten sposób tworzy hierarchia klas wyjątków), takich jak ERangeError, EDivByZero, EIntOverflow itp.
W większości przypadków wyjątki, które można obsługiwać w chronionym bloku try / wyjątku, nie byłyby wyjątkiem (podstawowa) klasa, ale jakiejś specjalnej klasy potomnej wyjątku zdefiniowanej w VCL lub w bibliotece, którą jesteś za pomocą.
Obsługa wyjątków za pomocą Try / Except
Aby przechwycić i obsłużyć typ wyjątku, należy zbudować procedurę obsługi wyjątku „on_typ_wyjątku do”. „Na wyjściu do” wygląda prawie jak klasyczna instrukcja:
próbować
ThisFunctionMightRaiseAnException;
wyjątek EZeroDivide dobegin// coś przy dzieleniu przez zerokoniec;
na EIntOverflow dobegin// coś, gdy obliczenia są zbyt dużekoniec;
elsebegin// coś, gdy zgłaszane są inne typy wyjątkówkoniec;
koniec;
Zauważ, że inna część przechwyciłaby wszystkie (inne) wyjątki, w tym te, o których nic nie wiesz. Zasadniczo, twój kod powinien obsługiwać tylko wyjątki, które naprawdę wiesz, jak sobie z tym poradzić i których oczekujesz.
Ponadto nigdy nie należy „jeść” wyjątku:
próbować
ThisFunctionMightRaiseAnException;
z wyjątkiem
koniec;
Zjedzenie wyjątku oznacza, że nie wiesz, jak obsłużyć wyjątek lub nie chcesz, aby użytkownicy widzieli wyjątek lub cokolwiek pomiędzy.
Kiedy obsłużysz wyjątek i potrzebujesz więcej danych z niego (w końcu jest to instancja klasy), a jedynie typ wyjątku, który możesz zrobić:
próbować
ThisFunctionMightRaiseAnException;
wyjątek E: Wyjątek dobegin
ShowMessage (E.Message);
koniec;
koniec;
„E” w „E: Exception” jest tymczasową zmienną wyjątkową typu określonego po znaku kolumny (w powyższym przykładzie podstawowa klasa Exception). Za pomocą E można odczytać (lub zapisać) wartości do obiektu wyjątku, takie jak pobranie lub ustawienie właściwości Message.
Kto uwalnia wyjątek?
Czy zauważyłeś, w jaki sposób wyjątki są faktycznie instancjami klasy pochodzącej od wyjątku? Słowo kluczowe wywołuje instancję klasy wyjątku. To, co tworzysz (instancja wyjątku to obiekt), Ty również trzeba uwolnić. Jeśli (jako autor biblioteki) utworzysz instancję, czy użytkownik aplikacji ją zwolni?
Tutaj jest Delfy magia: Obsługa wyjątku automatycznie niszczy obiekt wyjątku. Oznacza to, że kiedy napiszesz kod w bloku „wyjątek / koniec”, zwolni on pamięć wyjątków.
Co się stanie, jeśli wyjątek ThisFunctionMightRaiseAnException rzeczywiście zgłosi wyjątek, a Ty go nie obsłużysz (to nie to samo, co „zjedzenie” go)?
Co jeśli numer / 0 nie jest obsługiwany?
Gdy w kodzie zostanie zgłoszony nieobsługiwany wyjątek, Delphi ponownie magicznie obsługuje wyjątek, wyświetlając użytkownikowi okno dialogowe błędu. W większości przypadków to okno dialogowe nie zapewnia wystarczającej ilości danych dla użytkownika (i wreszcie dla Ciebie), aby zrozumieć przyczynę wyjątku.
Jest to kontrolowane przez pętlę komunikatów najwyższego poziomu Delphi, gdzie wszystko wyjątki są przetwarzane przez globalny obiekt Application i jego metodę HandleException.
Aby globalnie obsługiwać wyjątki i wyświetlać własne, bardziej przyjazne dla użytkownika okno dialogowe, możesz napisać kod dla TApplicationEvents. Moduł obsługi zdarzeń OnException.
Zauważ, że globalny obiekt Application jest zdefiniowany w jednostce Forms. TApplicationEvents to komponent, którego można użyć do przechwytywania zdarzeń globalnego obiektu aplikacji.