Набор параметризованных исключений
От: Sorc17 Россия  
Дата: 22.07.11 11:29
Оценка:
Всем привет.

Хочу сделать сабж. Сейчас объясню. Допустим у меня есть две исключительных ситуации в программе: "Номер заказа %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++ [смех].
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.