Programování

Jak číst chybové hlášky a stack trace v Pythonu, JS, PHP a Javě

Stack trace není zeď textu. Naučte se v něm najít typ chyby, správný řádek a příčinu – na příkladech z Pythonu, Node.js, PHP a Javy včetně „Caused by“.

12. 10. 2026 · 4 min čtení

Začátečníci se chybové hlášky bojí, zkušení vývojáři se na ni těší – protože obvykle přesně říká, co je špatně. Stack trace (výpis zásobníku volání) ukazuje cestu, kterou program prošel, než spadl. Stačí vědět, kde začít číst.

Tři otázky, na které stack trace odpovídá

  1. Co se stalo – typ výjimky a zpráva.
  2. Kde se to stalo – soubor a řádek.
  3. Jak se tam program dostal – řetěz volání funkcí.

Pořadí, ve kterém tyto informace najdete, se liší podle jazyka. To je hlavní důvod zmatku.

Python: čtěte odspodu

Traceback (most recent call last):
  File "/app/main.py", line 12, in <module>
    report = build_report(orders)
  File "/app/report.py", line 8, in build_report
    total += order["price"] * order["qty"]
TypeError: unsupported operand type(s) for *: 'NoneType' and 'int'

Python píše „most recent call last“ – nejnovější volání je dole.

  • Poslední řádek = co: TypeError, násobíte None číslem.
  • Řádek nad ním = kde: report.py, řádek 8.
  • Výš = jak: volání z main.py, řádek 12.

Závěr: v některé objednávce je price rovno None. Chyba není v násobení, ale v datech. Stack trace ukazuje místo, kde problém vybuchl, ne nutně kde vznikl.

Pokud vidíte During handling of the above exception, another exception occurred: nebo The above exception was the direct cause of the following exception:, jde o řetězené výjimky. Původní příčina je ta první (horní) část.

JavaScript / Node.js: čtěte odshora

TypeError: Cannot read properties of undefined (reading 'email')
    at sendWelcome (/app/src/mail.js:14:22)
    at registerUser (/app/src/users.js:31:5)
    at async /app/src/routes.js:9:3

Tady je to obráceně: první řádek je co, druhý je kde (mail.js, řádek 14, sloupec 22), další jsou volající.

Cannot read properties of undefined (reading 'email') znamená, že máte neco.email a neco je undefined. Hledejte, odkud přišel objekt před tečkou.

V prohlížeči bývá kód zmenšený (minifikovaný) a odkazy vedou na app.3f9a.js:1:48213. Zapněte v buildu source mapy, pak DevTools ukážou původní soubory.

PHP

PHP Fatal error:  Uncaught Error: Call to a member function format() on null in /var/www/app/src/Invoice.php:27
Stack trace:
#0 /var/www/app/src/Controller.php(45): Invoice->render()
#1 /var/www/app/public/index.php(12): Controller->show()
#2 {main}
  thrown in /var/www/app/src/Invoice.php on line 27
  • Co: voláte ->format() na null (typicky datum, které není vyplněné).
  • Kde: Invoice.php:27.
  • #0, #1… jsou volající, #0 je nejblíž chybě.

Java: pozor na „Caused by“

Exception in thread "main" java.lang.IllegalStateException: Nelze načíst konfiguraci
    at com.app.Config.load(Config.java:40)
    at com.app.Main.main(Main.java:10)
Caused by: java.io.FileNotFoundException: config.yml (No such file or directory)
    at java.base/java.io.FileInputStream.open0(Native Method)
    at com.app.Config.load(Config.java:35)
    ... 1 more

V Javě se výjimky často obalují. Skutečná příčina je poslední Caused by: – tady chybějící config.yml. Horní výjimka je jen obal.

Jak najít „svůj“ řádek

Stack trace bývá plný řádků z frameworků a knihoven (node_modules, site-packages, vendor, java.base). Ty skoro nikdy nejsou příčinou. Postup:

  1. Najděte typ chyby a zprávu.
  2. Projděte výpis a najděte první řádek, který ukazuje do vašeho kódu.
  3. Otevřete tento soubor a řádek a podívejte se, jaké hodnoty tam vstupují.

Slovníček nejčastějších chyb

Hláška Co obvykle znamená
NoneType has no attribute (Py) / Cannot read properties of undefined (JS) / on null (PHP) / NullPointerException (Java) Proměnná je prázdná – něco se nenačetlo nebo funkce nic nevrátila
KeyError / IndexError Klíč ve slovníku nebo index v seznamu neexistuje
ModuleNotFoundError / Cannot find module Chybí balíček nebo je špatná cesta / virtuální prostředí
ECONNREFUSED Na dané adrese a portu nic neposlouchá (služba neběží)
EADDRINUSE Port už používá jiný proces
Permission denied / EACCES Práva k souboru, portu < 1024 nebo uživatel procesu
SyntaxError: Unexpected token Překlep, chybějící závorka, nebo jste parsovali HTML jako JSON

Když stack trace chybí

  • Python: logging.exception("Popis") uvnitř except zaloguje i celý traceback. Nikdy nepište except: pass.
  • Node.js: zachyťte nezachycené chyby process.on('unhandledRejection', …) a hlavně je logujte.
  • PHP: v produkci display_errors=Off, ale log_errors=On a nastavený error_log.
  • Server: podívejte se do logů služby, např. journalctl -u myapp -n 100 --no-pager.

Tip: zkopírujte celý výpis

Když se ptáte kolegy nebo AI, posílejte celý stack trace, ne jen poslední řádek, a k němu kód zmíněných řádků. V ColdHost AI můžete výpis i soubory přiložit přímo do zprávy a zvolit režim Řešení problémů – asistent dostane kontext, který potřebuje.