Предположим, что инструмент импорта на Java перехватывает низкоуровневый сбой и заменяет его на new ImportFailure("Import failed"). В диагностическом журнале теперь остаётся только это короткое сообщение. Вызывающий код не должен получать сведения о локальных файлах, но для расследования сбоя нужна причинная связь.
Я бы сохранил предметное исключение, а его конструктор передавал бы исходный сбой в Throwable как причину. Java позволяет сохранить эту связь, не меняя публичную категорию исключения на категорию нижнего уровня.
Публичный ответ может использовать предметную категорию и специально выбранное сообщение. Не следует брать его текст из getCause().getMessage(). В причине могут находиться именно те локальные сведения, которые мы хотели исключить из ответа. Внутренняя диагностика тоже требует контролируемой обработки, а не указания печатать все значения исключений.
Компромисс в том, что более подробным диагностическим сведениям нужны правила доступа и сокрытия чувствительных данных. Отбросив причину, мы избавляемся от обработки этих сведений, но получаем менее содержательное объяснение сбоя.
Что должен сохранять диагностический путь, чтобы неудачный импорт можно было расследовать, а вызывающий код получал только сведения, полезные для следующего действия?