Организация try-catch в Java: где лучше ловить ошибки, чтобы не потерять данные?
Недавно взялся за поддержку многопоточного приложения на Java и встал вопрос, как правильно вылавливать исключения, чтобы не потерять актуальное состояние данных. Варианта два, и у каждого свои заморочки. Первый — ловить исключения прямо внутри каждого потока, чтобы оперативно реагировать на ошибки. Плюс в том, что можно локально откатить изменения только для этого потока, без влияния на остальные. Минус — появляется риск рассинхронизации, особенно если есть общие ресурсы, потому что часть данных может обновиться, а часть — нет.
Второй вариант — дать потокам спокойно работать, а обработку ошибок делать централизованно, например, в контроллере или пуле потоков. Это проще для поддержания целостности данных, но проблема в том, что если поток завален исключениями, можно как пропустить часть ошибок, так и не сразу понять, где именно что-то сломалось. Ну и локальный контекст при таком подходе теряется — приходится разбираться по стеку.