Читаем стектрейсы: exception, caused by, at line

Тема дорожной карты · Английский для IT

🔊 Словарь терминов с произношением →

Стектрейс — самый информативный и самый пугающий текст, который выдаёт программа, и умение прочитать его за десять секунд отличает инженера, который чинит баг, от того, кто копирует всё в поиск. Общая структура одинакова во всех языках: тип исключения, сообщение и цепочка вызовов от места ошибки до точки входа. В Java: первая строка Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.length()" because "s" is null, далее строки at com.example.Service.process(Service.java:42) — метод, файл и номер строки, сверху вниз от самого глубокого вызова к самому внешнему; Caused by: вводит исходное исключение, обёрнутое во внешнее, и читать нужно с последнего Caused by; ... 12 more — пропущенные повторяющиеся фреймы. В Python: Traceback (most recent call last): и фреймы File "app.py", line 42, in process снизу вверх, то есть последняя строка — сама ошибка ValueError: invalid literal for int(); During handling of the above exception, another exception occurred и The above exception was the direct cause of the following exception — цепочки. В JavaScript / Node: TypeError: Cannot read properties of undefined (reading 'length') и фреймы at process (/app/service.js:42:15) с номером строки и столбца. В Go: panic: runtime error: index out of range [3] with length 3 и goroutine 1 [running]: с фреймами. В Rust: thread 'main' panicked at src/main.rs:42:5: index out of bounds. Ключевые слова: exception — исключение, error, panic (Go, Rust), fatal, unhandled / uncaught — необработанное, thrown / raised — выброшено, frame — кадр стека, call stack, stack overflow — переполнение стека, null pointer / nil / undefined / None, out of bounds / out of range — выход за границы, timeout, connection refused, permission denied, not found, illegal state, illegal argument, type error, assertion failed, segfault, core dumped, heap, out of memory (OOM), deadlock detected, recursion depth exceeded, wrapped — обёрнутое исключение, root cause — первопричина, innermost / outermost — самое внутреннее / внешнее.

Как произносится

Exception /ɪkˈsɛpʃən/, trace /treɪs/, traceback /ˈtreɪsbæk/, frame /freɪm/, thrown /θroʊn/ (с «θ»), raised /reɪzd/, caught /kɔːt/ (gh немое, как cot), uncaught /ʌnˈkɔːt/, unhandled /ʌnˈhændld/, null /nʌl/, nil /nɪl/, undefined /ˌʌndɪˈfaɪnd/, invoke /ɪnˈvoʊk/, panic /ˈpænɪk/, fatal /ˈfeɪtl/ («фЕйтл»), assertion /əˈsɜːrʃən/, recursion /rɪˈkɜːrʒən/, overflow /ˈoʊvərfloʊ/, heap /hiːp/, bounds /baʊndz/, illegal /ɪˈliːɡəl/, literal /ˈlɪtərəl/, goroutine /ˈɡoʊruːtiːn/, root cause /ruːt kɔːz/, innermost /ˈɪnərmoʊst/, verbose /vɜːrˈboʊs/.

Как употребляется

  • Read it from the last Caused by up: that's the root cause. — Читай с последнего Caused by вверх, там первопричина.
  • The NPE is at Service.java line 42; the request object is null. — NPE в Service.java, строка 42, объект запроса null.
  • It's an uncaught exception in the worker, so the process dies. — Необработанное исключение в воркере, процесс умирает.
  • Python tracebacks go bottom-up: the last line is the actual error. — В Python трейсбэк читают снизу вверх, последняя строка и есть ошибка.
  • Index out of range means we're off by one somewhere. — Выход за границы значит, что где-то ошибка на единицу.
  • Let's wrap it with context so the trace says which user it failed for. — Обернём с контекстом, чтобы трейс показывал, на каком пользователе упало.
  • Stack overflow here is unbounded recursion, not the website. — Переполнение стека здесь — бесконечная рекурсия, а не сайт.

Ловушки

Первая ловушка — читать сверху вниз всегда: Java и JavaScript показывают ошибку сверху, Python снизу. Вторая — останавливаться на первом исключении: в Java первопричина в последнем Caused by, в Python в первом трейсбэке перед During handling. Третья — caught произносить с «гх» или как cut: /kɔːt/. Четвёртая — exception и error как синонимы: в Java Error это отдельный класс для проблем JVM (OutOfMemoryError), в Python всё наследуется от Exception, в Go ошибки — обычные значения, а panic — аварийная ситуация. Пятая — null как «нуль» (число): /nʌl/ и означает отсутствие значения. Шестая — фрейм из библиотеки принимать за место бага: ищите первый фрейм из своего кода (first frame in our package). Седьмая — переводить стектрейс при поиске: ищите английский текст сообщения без конкретных значений (Cannot read properties of undefined (reading), а не «не удаётся прочитать свойства».

Связанные понятия

Полезные ресурсы