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 <код>.