Здравствуйте,
Я сейчас между работами, так что у меня полно времени, чтобы разбираться в 100-строчной программе.
ledger-import читает CSV с разделителем «точка с запятой» и пишет очищенные строки в staging-файл. Ничего не должно оставаться в staging, если весь файл не разобран целиком. В моём тестовом файле data/march.csv на строке 4 битая сумма (-12,5x). Я ожидал import rejected: line 4: bad amount ... и код выхода 2. А получаю вот это, с кодом выхода 3:
SEVERE: staging problem: staging file build/staging.tmp closed with 2 uncommitted rows
Номера строки и плохого значения нигде нет. Если временно добавить System.err.println в catch-блок parse(), то оно печатается, то есть ImportFailure действительно создаётся. Просто в Main он не приходит. Когда я исправляю строку 4, импорт работает нормально.
Сначала я подозревал порядок catch в Main и настройку logging.properties. Перестановка двух catch-блоков ничего полезного не изменила. Вот соответствующие части:
// Importer.run()
StagingWriter writer = new StagingWriter(staging);
try {
...
writer.add(parse(lineNo, line));
...
writer.commit();
return writer.count();
} finally {
writer.close();
}
// StagingWriter.close()
out.close();
if (!committed && rows > 0) {
Files.deleteIfExists(path);
throw new IOException("staging file " + path + " closed with " + rows + " uncommitted rows");
}
Main сначала ловит ImportFailure (exit 2), потом IOException (exit 3).
Возможно ли, что проблема вообще не в логировании? Куда девается моё исключение?