Мой вопрос: можно ли создать новое исключение и просто сохранить его, скажем, в списке, а не бросать, чтобы не останавливать обработку?
Да.Это будет работать.Это довольно дорого, потому что объект Exception захватывает все кадры стека текущего потока.Если вы не собираетесь использовать кадры стека и не собираетесь генерировать исключение, то вы проделали много ненужной работы.Если нет особой причины, по которой вам нужно использовать Exception
, тогда простой класс для сбора подробностей об ошибке - гораздо лучшая идея.
Однако есть хитрый способ/ трюк, который вы можете использовать, чтобы сделать объект исключения менее дорогим для создания экземпляра.Если вы посмотрите на Throwable
API, вы заметите, что есть метод с именем fillInStackTrace()
.Метод вызывается самим конструктором Throwable
для захвата кадров стека, и реализация (в Throwable
) делает это в некотором родном коде.Однако этот метод не final
, поэтому вы можете переопределить его в пользовательском классе исключений, чтобы превратить его в неоперативный.
Вуаля!Конструктор, который работает намного быстрее!Но, конечно, если вам понадобится трассировка стека для исключения, вам не повезло.Поэтому я бы рекомендовал использовать этот хак / трюк очень экономно.