Co to jest runtime error (błąd wykonania)?
Runtime error (błąd wykonania) to błąd, który pojawia się w trakcie działania programu, gdy operacji nie da się wykonać na wartościach, które akurat ma, na przykład przy dzieleniu przez zero albo odczycie spoza końca listy. Program zatrzymuje się w tej linii, chyba że błąd zostanie obsłużony.
Aktualizacja: 24 września 2026
Runtime error czeka, aż program zacznie działać. Kod przechodzi wszystkie kontrole przed startem, przez chwilę działa poprawnie, a potem dochodzi do operacji, której nie da się wykonać na wartościach, jakie ma w danej chwili. Ta funkcja działa dla jednej listy i zawodzi dla innej:
85.0
Traceback (most recent call last):
File "main.py", line 5, in <module>
print(average([]))
^^^^^^^^^^^
File "main.py", line 2, in average
return sum(scores) / len(scores)
~~~~~~~~~~~~^~~~~~~~~~~~~
ZeroDivisionError: division by zero
Pierwsze wywołanie wypisuje 85.0. Drugie przekazuje pustą listę, więc len(scores) wynosi 0 i dzielenia nie da się wykonać. Z gramatyką wszystko było w porządku, więc to nie jest błąd składniowy. Problem istnieje tylko dla pewnych danych i dlatego błąd wykonania może się pojawić, choć program sto razy wcześniej działał poprawnie.
Co się dzieje, gdy wystąpi błąd wykonania
- Program dochodzi do operacji, tutaj
sum(scores) / len(scores). - Środowisko uruchomieniowe (runtime) sprawdza ją przed wykonaniem. CPython sprawdza dzielnik przed dzieleniem, JVM sprawdza każdy indeks tablicy, a Python sprawdza, czy klucz słownika istnieje, zanim zwróci jego wartość.
- Sprawdzenie kończy się niepowodzeniem, więc runtime tworzy obiekt błędu. W Pythonie i Javie ten obiekt jest wyjątkiem i zapisuje typ błędu, komunikat oraz miejsce, w którym błąd wystąpił.
- Runtime szuka kodu, który obsługuje ten typ błędu: najpierw w bieżącej funkcji, potem w funkcji, która ją wywołała, i tak dalej na zewnątrz.
- Jeśli nic go nie obsłuży, program się zatrzymuje. Python wypisuje traceback i kończy działanie z kodem wyjścia 1. Java wypisuje ślad stosu zaczynający się od
Exception in thread "main".
Języki bez takich kontroli zachowują się inaczej. C nie sprawdza indeksów tablic ani wskaźników, więc błędny dostęp do pamięci albo po cichu psuje dane, albo sprawia, że system operacyjny kończy program z komunikatem segmentation fault.
Wszystko, co program zrobił przed linią z błędem, już się wydarzyło. Ta pętla wypisuje trzy kolory, zanim wyłoży się na czwartym:
red
green
blue
Traceback (most recent call last):
File "main.py", line 4, in <module>
print(colors[i])
~~~~~~^^^
IndexError: list index out of range
Jak czytać traceback
Traceback w Pythonie czyta się od dołu. Ostatnia linia podaje typ błędu i komunikat: ZeroDivisionError: division by zero. Linie nad nią pokazują łańcuch wywołań, od najstarszego do najnowszego. W pierwszym przykładzie linia 5 wywołała average, a linia 2, wewnątrz average, to miejsce, w którym dzielenie się nie udało.
Linia, w której wystąpił błąd, nie zawsze jest linią do poprawienia. Linia 2 funkcji average jest poprawna. Prawdziwe pytanie brzmi: jak trafiła tam pusta lista? Prześledź więc błędną wartość aż do jej źródła i popraw ją tam. Gdy traceback przechodzi przez pliki bibliotek, które nie są twoje, szukaj ostatniej linii wskazującej na twój własny plik.
Najczęstsze błędy wykonania
Każdy z tych komunikatów jest skopiowany z Pythona 3.12.
| Błąd | Przykład | Komunikat |
|---|---|---|
ZeroDivisionError | 10 / 0 | division by zero |
IndexError | ["red", "green", "blue"][3] | list index out of range |
KeyError | {"theme": "dark"}["font"] | 'font' |
ValueError | int("twenty") | invalid literal for int() with base 10: 'twenty' |
TypeError | "Total: " + 5 | can only concatenate str (not "int") to str |
AttributeError | wywołanie .upper() na None | 'NoneType' object has no attribute 'upper' |
FileNotFoundError | open("missing.txt") | [Errno 2] No such file or directory: 'missing.txt' |
RecursionError | funkcja, która wywołuje samą siebie bez końca | maximum recursion depth exceeded |
Java ma bezpośrednie odpowiedniki, takie jak ArithmeticException, ArrayIndexOutOfBoundsException, NumberFormatException i NullPointerException. Dzielenie całkowite przez zero, którego nic nie przechwyci, wypisuje w Javie coś takiego:
Exception in thread "main" java.lang.ArithmeticException: / by zero
JavaScript jest bardziej wyrozumiały dla liczb: 10 / 0 daje Infinity, a nie błąd. Wysypuje się za to, gdy używasz wartości, której nie ma. Node.js wypisuje to dla user.name, gdy user ma wartość undefined:
TypeError: Cannot read properties of undefined (reading 'name')
Jak naprawić błąd wykonania
- Odtwórz go. Uruchom program ponownie z tymi samymi danymi i potwierdź, że pojawia się ten sam błąd.
- Przeczytaj ostatnią linię tracebacku, a potem znajdź odpowiadającą jej linię we własnym kodzie.
- Sprawdź wartości, których to dotyczy. Wypisz je tuż przed linią z błędem albo zatrzymaj się tam punktem przerwania w debugerze.
- Usuń przyczynę. Popraw indeks, zabezpiecz szczególny przypadek albo zweryfikuj dane wejściowe przed ich użyciem.
W funkcji average rozwiązaniem jest zdecydować, ile ma wynosić średnia z braku ocen, i zapisać to w kodzie:
85.0
0
Niektóre awarie nie zależą od ciebie: plik, który ktoś usunął, sieć, która nie odpowiada w wyznaczonym czasie, użytkownik, który wpisuje litery tam, gdzie powinna być liczba. Nie zapobiegniesz im, poprawiając kod, więc przechwytujesz je dzięki obsłudze wyjątków i decydujesz, co program ma zrobić dalej. Nie należy natomiast owijać błędu w kodzie w try i go ukrywać. IndexError z pętli, która liczy o jeden krok za daleko, to pomyłka do poprawienia, a nie błąd do przechwycenia.
Komunikaty runtime error w Windows i w Excelu
Termin pojawia się też poza twoim własnym kodem. Okno dialogowe Windows zatytułowane Microsoft Visual C++ Runtime Library ze słowami Runtime Error! oznacza, że program napisany w C++ natrafił na błąd krytyczny i środowisko uruchomieniowe C++ go zakończyło. Jako użytkownik nie możesz zmienić tego kodu, więc typowe rozwiązania to aktualizacja programu, naprawa lub ponowna instalacja pakietów Microsoft Visual C++ Redistributable, a w przypadku gier aktualizacja sterownika karty graficznej.
Makra Excela napisane w VBA zgłaszają numerowane błędy wykonania. Run-time error '9': Subscript out of range oznacza, że makro odwołało się do arkusza lub elementu tablicy, który nie istnieje, a Run-time error '1004' to ogólny błąd zgłaszany, gdy nie powiedzie się operacja na skoroszycie, arkuszu lub zakresie. Idea jest ta sama co w Pythonie: poprawny kod trafił na wartość, z którą nie umiał sobie poradzić.
Co dalej
Błędy wykonania mają dwóch krewnych: błąd składniowy, wykrywany, zanim program wystartuje, i błąd logiczny, który nigdy nie daje żadnego komunikatu. Aby zamiast awarii wychodzić z błędów wykonania obronną ręką, przeczytaj o obsłudze wyjątków, a potem przewodniki po Pythonie o wyjątkach i debugowaniu błędów. W kursie Pythona piszesz i poprawiasz taki kod w każdej lekcji.
Najczęściej zadawane pytania
Czym różni się runtime error od błędu składniowego?
Dlaczego ciągle dostaję błędy wykonania?
Co oznacza Runtime Error na LeetCode?
None albo rekurencja tak głęboka, że przepełnia stos. Uruchom samodzielnie dane, które nie przeszły, pokazane na stronie wyników, i sprawdź przypadki brzegowe: pustą tablicę, jeden element i największy dozwolony rozmiar.Czy runtime error to to samo co wyjątek?
RuntimeException to dodatkowo nazwa konkretnej rodziny wyjątków, tych niekontrolowanych, takich jak NullPointerException.