Перейти к содержанию

10. Ошибки и отладка

← Практический гайд · Оглавление

Как JOBS сообщает об ошибках

При непойманной ошибке интерпретатор выводит структурированное сообщение с файлом, причиной и, когда позиция известна, строкой и символом. Сообщение рассчитано на автора JOBS-скрипта: оно объясняет, что именно не так, и часто содержит пример корректной записи.

Пример сообщения:

JOBS error
  File: script.jobs
  Line: 1, column: 11
  Reason: Parse error: Expected an expression here. Examples of expressions: $name, 123, "text", [1, 2], map { "key": "value" }, exec(echo hello).
  Tip: set JOBS_DEBUG=1 to print the Java stack trace.

Runtime-ошибки, для которых позиция в исходном файле пока недоступна, всё равно выводят файл и понятную причину. Java stack trace по умолчанию скрыт, чтобы обычные ошибки скрипта не терялись в служебном выводе.

Если вы отлаживаете сам интерпретатор, Java-интеграцию или неожиданное поведение внутри reflection-вызова, включите stack trace явно:

JOBS_DEBUG=1 java -jar jobs.jar script.jobs

Частые причины ошибок

Условие не Boolean

Условия в if и while должны быть булевыми.

$items = []

if $items.Is-Empty() {
    println "empty"
}

Не передан обязательный параметр

params {
    $input Path
}

Запуск без --input приведёт к help и коду 255.

Неверная регулярка или escaping

В re"..." обратная косая черта экранируется как в обычной строке. Для Java-регулярки \d+ нужно писать re"\\d+".

$number = re"\\d+"
println $number.Matches("123")

Ошибка внешней команды

exec(...) не выбрасывает исключение при ненулевом exit code процесса. Код нужно проверять вручную:

$result = exec( grep needle missing-file.txt )

if $result.code != 0 {
    println "command failed: " + $result.err
}

Исключение будет выброшено, если утилита не найдена или процесс не удалось запустить.

Нужен полный Java stack trace

Обычный запуск показывает только читаемую JOBS-ошибку. Для низкоуровневой диагностики включите переменную окружения:

JOBS_DEBUG=1 java -jar jobs.jar script.jobs

Значения 0, false и пустое значение считаются выключенным debug-режимом.

Обработка ошибок

Используйте try / catch для ожидаемых исключений:

use [[ java.lang.Integer ]] as Integer

try {
    $value = Integer.parseInt("abc")
    println $value
} catch NumberFormatException as $err {
    println "not a number: " + $err.getMessage()
}

Для собственных ошибок используйте throw:

Validate($value) {
    if $value == null {
        throw "value is required"
    }
    return $value
}

Отладочные приёмы

Печатайте промежуточные значения

println "input=" + $input
println "items=" + $items.Join(", ")

Проверяйте типы

if $value is String {
    println "string: " + $value
} elif $value is List {
    println "list size=" + $value.Size()
}

Завершайте сценарий понятным кодом

if $errors.Size() > 0 {
    println "failed with " + $errors.Size() + " errors"
    exit 1
}

Коды завершения интерпретатора

Основные коды:

  • 0 — успешное выполнение;
  • 64 — запуск без обязательных CLI-аргументов интерпретатора;
  • 70 — непойманная ошибка верхнего уровня;
  • 255 — ошибка параметров params или help/error path внутри обработки параметров.

Скрипт может вернуть другой код через exit <код>.

← Практический гайд · Оглавление