Всем привет.
Хочу сделать сабж. Сейчас объясню. Допустим у меня есть две исключительных ситуации в программе: "Номер заказа %d неверный." и "Количество упаковок должно быть от %d до %d." Эти исключения пусть принадлежат одному классу исключений LimitException. В месте где происходят исключения, туда нужно подставить конкретные значения вместо %d. Понятное дело, писать везде:
throw new LimitException(sprintf("Номер заказа %d неверный.", num));
не вариант. Пока что я придумал такое решение: сделал хешмап лямбд, которые принимают нужные параметры и возвращают готовое сообщение. Остаётся вызвать нужную лямбду в месте где происходит исключение и получить от неё готовое сообщение с подставленным значением параметра:
throw new LimitException(exceptions['ORDER_NUM'](num));
throw new LimitException(exceptions['PACKS_COUNT'](min, max));
Народ говорит что так делать можно и некоторые так или подобным образом и поступают, и что ещё есть вариант сделать два наследника LimitException: OrderNumberException и PacksCountException и юзать их:
throw new OrderNumberException(num);
throw new PacksCountException(min, max);
но мне кажется последний вариант как-то не очень, хотя бы потому, что у меня сейчас 95 подобных исключтельных ситуаций и делать 95 наследников, а потом писать пару десятков catch в конце скрипта ... К тому же может быть оно ещё и точки зрения ООП не расово, по сути получается класс строк, в которых к примеру второе слово в строке параметризовано. Хотя может с точки зрения ООП это вполне ок. Не знаю.
Посоветуйте какие ещё есть годные варианты и как народ делает в своём
серьёзном бизнесе(тм) такие вещи.
Для нас [Thompson, Rob Pike, Robert Griesemer] это было просто исследование. Мы собрались вместе и решили, что ненавидим C++ [смех].