Który z poniższych błędów wykonania aplikacji można obsłużyć za pomocą wyjątków?
A. Błąd składniowy
B. Niezgodność typów danych w kodzie
C. Błąd kompilacji
D. Błąd dzielenia przez zero
Błąd dzielenia przez zero to typowy przykład błędu wykonania, czyli takiego, który pojawia się dopiero w czasie działania programu. W wielu językach można go obsłużyć mechanizmem wyjątków, np. przez try-catch w Javie lub C#, albo try-except w Pythonie. Gdy program próbuje wykonać operację w stylu a / b, a zmienna b ma wartość 0, środowisko uruchomieniowe może zgłosić wyjątek, np. ArithmeticException albo ZeroDivisionError. Dzięki temu aplikacja nie musi od razu się wywalić, tylko może zareagować: pokazać komunikat użytkownikowi, zapisać błąd w logach, użyć wartości domyślnej albo przerwać tylko konkretną operację. Moim zdaniem dobra praktyka jest taka, żeby nie polegać wyłącznie na łapaniu wyjątku, ale wcześniej sprawdzać dane wejściowe, czyli np. if dzielnik != 0. Wyjątki powinny obsługiwać sytuacje niepoprawne lub wyjątkowe, a nie zastępować normalną logikę programu. W branżowym podejściu ważne jest też łapanie możliwie konkretnego wyjątku, a nie ogólnego Exception bez potrzeby, bo potem debugowanie robi się mało przyjemne i łatwo ukryć prawdziwy problem.
W tym pytaniu łatwo pomylić różne rodzaje błędów, bo wszystkie brzmią jak coś, co psuje program. Różnica jest jednak ważna: wyjątki służą głównie do obsługi problemów pojawiających się w czasie wykonania aplikacji, a nie do naprawiania kodu, który jest niepoprawny jeszcze przed uruchomieniem. Błąd składniowy oznacza, że zapis programu nie spełnia reguł języka, na przykład brakuje nawiasu, średnika albo użyto złej konstrukcji. Taki kod zwykle w ogóle się nie uruchomi, więc nie ma momentu, w którym try-catch mógłby zadziałać. Podobnie błąd kompilacji jest wykrywany przez kompilator lub narzędzia budujące projekt. To sygnał dla programisty, że trzeba poprawić źródła programu, zależności albo konfigurację, a nie obsługiwać sytuację w aplikacji podczas działania. Niezgodność typów danych w kodzie też najczęściej jest problemem statycznym, szczególnie w językach takich jak Java, C# czy C++. Jeśli próbujesz przypisać tekst do zmiennej liczbowej bez konwersji, kompilator powie stop. W językach dynamicznych część problemów z typami może wyjść dopiero podczas działania, ale w kontekście tej odpowiedzi chodzi o błąd zapisany w kodzie, a nie o typową sytuację obsługiwaną wyjątkiem biznesowo. Typowy błąd myślowy polega na wrzucaniu wszystkich awarii do jednego worka. W praktyce warto rozróżniać błędy składni i kompilacji, które poprawiamy przed wdrożeniem, od błędów wykonania, które możemy przewidywać, testować, logować i obsługiwać mechanizmem wyjątków.