Menu
Coddy logo textTech

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.

Autor: Kevin Spektor, Współzałożyciel i CTO

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

  1. Program dochodzi do operacji, tutaj sum(scores) / len(scores).
  2. Ś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ść.
  3. 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ł.
  4. 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.
  5. 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łądPrzykładKomunikat
ZeroDivisionError10 / 0division by zero
IndexError["red", "green", "blue"][3]list index out of range
KeyError{"theme": "dark"}["font"]'font'
ValueErrorint("twenty")invalid literal for int() with base 10: 'twenty'
TypeError"Total: " + 5can only concatenate str (not "int") to str
AttributeErrorwywołanie .upper() na None'NoneType' object has no attribute 'upper'
FileNotFoundErroropen("missing.txt")[Errno 2] No such file or directory: 'missing.txt'
RecursionErrorfunkcja, która wywołuje samą siebie bez końcamaximum 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

  1. Odtwórz go. Uruchom program ponownie z tymi samymi danymi i potwierdź, że pojawia się ten sam błąd.
  2. Przeczytaj ostatnią linię tracebacku, a potem znajdź odpowiadającą jej linię we własnym kodzie.
  3. Sprawdź wartości, których to dotyczy. Wypisz je tuż przed linią z błędem albo zatrzymaj się tam punktem przerwania w debugerze.
  4. 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?
Błąd składniowy wykrywany jest, zanim program wystartuje, bo kod łamie gramatykę języka, więc nie wykonuje się ani jedna linia. Runtime error pojawia się później, w trakcie działania programu, gdy poprawna linia trafia na wartość, z którą nie umie sobie poradzić. Wszystkie wcześniejsze linie już się wykonały i mogły coś wypisać.
Dlaczego ciągle dostaję błędy wykonania?
Zwykle dlatego, że kod zakłada coś o swoich danych, co nie zawsze jest prawdą: że lista nigdy nie jest pusta, że plik istnieje, że użytkownik wpisze liczbę. Każde takie założenie działa dla przetestowanych danych i zawodzi dla tych, których nikt nie sprawdził. Testuj puste, zerowe, brakujące i bardzo duże dane wejściowe, a te przypadki sprawdzaj lub obsługuj jawnie.
Co oznacza Runtime Error na LeetCode?
Oznacza, że twoje rozwiązanie się skompilowało, ale wysypało się na co najmniej jednym przypadku testowym. Typowe przyczyny to indeks poza zakresem, dzielenie przez zero, użycie wartości null lub 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?
Niezupełnie. W Pythonie i Javie większość błędów wykonania zgłaszana jest jako wyjątki i właśnie dzięki temu program może je przechwycić. Ale języki takie jak C mają błędy wykonania i w ogóle nie mają wyjątków. W Javie RuntimeException to dodatkowo nazwa konkretnej rodziny wyjątków, tych niekontrolowanych, takich jak NullPointerException.
Czy kompilator może wykryć błędy wykonania?
Tylko niektóre. Kompilator albo narzędzie do sprawdzania typów, takie jak mypy, potrafi udowodnić, że pewne pomyłki są niemożliwe, na przykład dodawanie tekstu do liczby. Nie zna jednak wartości, które pojawiają się dopiero w trakcie działania programu, takich jak liczba wpisana przez użytkownika, która okazuje się zerem. Takie błędy da się znaleźć tylko przez uruchomienie kodu albo obsłużyć, sprawdzając dane wejściowe.
Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ