В конечном итоге я выбрал первый вариант и создал облегченный универсальный класс «результирующий пакет», который инкапсулирует успехи и неудачи действия над коллекцией объектов. Успех или неудача связаны с соответствующим идентификатором объекта.
Пакет заполняется внутри каждого вызова бизнес-логики и возвращается на уровень представления. Исключения, выдаваемые в цикле бизнес-логики «выполнить действие над объектом», перехватываются и в результирующий пакет добавляется соответствующий сбой (связанный с идентификатором объекта).
Слой представления имеет простой вспомогательный метод, который представляет обратную связь, содержащуюся в пакете результатов, пользователю.
Это работает очень хорошо.
Я думаю, что подход, который вы используете, это то, что лучше всего подходит для вашей системы.