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“.
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á
- Co se stalo – typ výjimky a zpráva.
- Kde se to stalo – soubor a řádek.
- 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íteNonečí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()nanull(typicky datum, které není vyplněné). - Kde:
Invoice.php:27. #0,#1… jsou volající,#0je 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:
- Najděte typ chyby a zprávu.
- Projděte výpis a najděte první řádek, který ukazuje do vašeho kódu.
- 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řexceptzaloguje i celý traceback. Nikdy nepišteexcept: pass. - Node.js: zachyťte nezachycené chyby
process.on('unhandledRejection', …)a hlavně je logujte. - PHP: v produkci
display_errors=Off, alelog_errors=Ona 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.