Привет!
Имеется система:
входные данные -> преобразователь1 -> преобразователь2 -> ... -> выходные данные.
То есть цепочка преобразователей, что-то вроде трубы cat | grep | sed | wc. В зависимости от входных данных цепочки, пройдя через ряд преобразователей, ошибка может быть обнаружена где-то в середине цепочки, и, чтобы в сообщении об ошибке отразить полную информацию о причине проблемы, хочется выдать не просто «преобразователь3: некорректное поле Х в позиции У», а собрать всю цепочку входных данных для каждого предыдущего преобразователя. Примерно:
IN: 2 a b 1 c 4 d e f ->
proc1 -> (2 a b) (1 c) (4 d e f) ->
proc2 -> (a b) (c) ... FAIL: too few fields in (d e f), received 3, expected 4.
И вот вопрос, как правильно (или принято? или просто элегантные идеи?) собирать такие сообщения воедино? У меня две мысли.
1. Внутрь каждого преобразователя отправлять вместе с входными данными и историю входных данных предшественников, в случае ошибки сигнализировать об исключении, в общем, что-то вроде ведения лога. Плюс: одно место обработки ошибки; минус: засорение интерфейсов преобразователей и как следствие возня с накоплением истории и усложнение вызовов последователей. Возможно, минус этот можно избежать, но ничего кроме еще больших костылей вроде глобальных переменных, в голову не лезет.
2. Каждый преобразователь умеет сигнализировать об исключении в рамках своих входных данных, но в то же время ловит исключения последователя, к этому исключению аттачит свои входные данные, бросает исключение еще выше и т.д. Плюс: мне кажется логичным. Минус: лапша однотипных обработчиков ошибок. Ок, в лиспе можно спрятать в макру, но как быть с этим например в С++?
Какие еще есть идеи? Уверен, что проблема типичная, но сформулировать краткий и емкий вопрос в гугл не получается.