Стоит ли в данном случае генерировать исключение
От: Serge_HID Россия  
Дата: 16.10.08 19:30
Оценка:
Для работы с базой данных, выполняющей роль справочника, используется класс-хелпер, имеющий методы addItem(Item item), getItem(String id), clearItems()... (на самом деле роль item'а может играть любая сущность, хранящаяся в справочнике, но не в этом суть).

Мой вопрос касается метода addItem(Item item): стоит ли выбрасывать наружу исключения если такой item в БД уже существует.
С одной стороны не очень удобно каждый раз заключать в try/catch блок с вызовом addItem, с другой — гасить исключение внутри метода ИМХ тоже нехорошо.

Что вы думаете по этому поводу?

Спасибо.
Re: Стоит ли в данном случае генерировать исключение
От: Alexander G Украина  
Дата: 16.10.08 20:53
Оценка: :)
Здравствуйте, Serge_HID, Вы писали:

S_H>Мой вопрос касается метода addItem(Item item): стоит ли выбрасывать наружу исключения если такой item в БД уже существует.

S_H>С одной стороны не очень удобно каждый раз заключать в try/catch блок с вызовом addItem, с другой — гасить исключение внутри метода ИМХ тоже нехорошо.

S_H>Что вы думаете по этому поводу?


Пример изящного решения этой дилеммы есть в С++ в стандартной библиотеке:
std::map<int, item> somemap;
...
std::pair<std::map<int, item>::iterator, bool> inserted = somemap.insert(1, item());
Русский военный корабль идёт ко дну!
Re: Стоит ли в данном случае генерировать исключение
От: Константин Л. Франция  
Дата: 16.10.08 21:10
Оценка:
Здравствуйте, Serge_HID, Вы писали:

[]

Как-то очень долго флеймил на эту тему с друзьями-джавистами. У них Add возвращает bool
Re: Стоит ли в данном случае генерировать исключение
От: Beam Россия  
Дата: 16.10.08 21:50
Оценка:
Здравствуйте, Serge_HID, Вы писали:

S_H>Для работы с базой данных, выполняющей роль справочника, используется класс-хелпер, имеющий методы addItem(Item item), getItem(String id), clearItems()... (на самом деле роль item'а может играть любая сущность, хранящаяся в справочнике, но не в этом суть).


S_H>Мой вопрос касается метода addItem(Item item): стоит ли выбрасывать наружу исключения если такой item в БД уже существует.

S_H>С одной стороны не очень удобно каждый раз заключать в try/catch блок с вызовом addItem, с другой — гасить исключение внутри метода ИМХ тоже нехорошо.

S_H>Что вы думаете по этому поводу?


addItem(item) — не кидает исключение
addItemOrDie(item) — кидает
Ну типа saveItem и createItem.

Годится?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Best regards, Буравчик
Re: Стоит ли в данном случае генерировать исключение
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 16.10.08 23:27
Оценка:
Здравствуйте, Serge_HID, Вы писали:

S_H>Мой вопрос касается метода addItem(Item item): стоит ли выбрасывать наружу исключения если такой item в БД уже существует.

S_H>С одной стороны не очень удобно каждый раз заключать в try/catch блок с вызовом addItem, с другой — гасить исключение внутри метода ИМХ тоже нехорошо.

S_H>Что вы думаете по этому поводу?


Зависит от того, что считается постусловием операции addItem. Если постусловие — вставка указанного объекта (и её последствия, например — захват ссылки на объект), то кидаем исключение или возвращаем false, то есть каким-то образом сигнализируем о том, что постусловие не выполняется. Если постусловие — такое состояние агрегата, что он содержит объект эквивалентный item, то исключения имеют смысл, если произошло нечто, не связанное с состоянием агрегата: например, оборвалась связь с сервером БД, не хватило места на диске и т.п.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re: Стоит ли в данном случае генерировать исключение
От: elmal  
Дата: 17.10.08 05:56
Оценка:
Здравствуйте, Serge_HID, Вы писали:

S_H>Мой вопрос касается метода addItem(Item item): стоит ли выбрасывать наружу исключения если такой item в БД уже существует.

S_H>Что вы думаете по этому поводу?
Зависит от того, исключительная это у тебя ситуация или нормальное течение программы. Если это исключение кидает база, то глушить его никакого смысла нет — это уже исключительная ситуация. Но вообще, я лично стараюсь на дубликаты проверять перед вставкой в базу, так что до исключения базы обычно дела не доходит. Хотя, логику валидации перед сохранением один черт делаю кидающим исключения, которое упаковывает в объект исключения все ошибки, которые найдет — получается очень удобно.
Re[2]: Стоит ли в данном случае генерировать исключение
От: Serge_HID Россия  
Дата: 17.10.08 06:45
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Зависит от того, что считается постусловием операции addItem. Если постусловие — вставка указанного объекта (и её последствия, например — захват ссылки на объект), то кидаем исключение или возвращаем false, то есть каким-то образом сигнализируем о том, что постусловие не выполняется. Если постусловие — такое состояние агрегата, что он содержит объект эквивалентный item, то исключения имеют смысл, если произошло нечто, не связанное с состоянием агрегата: например, оборвалась связь с сервером БД, не хватило места на диске и т.п.


В принципе в данном случае постусловия как такого нет, т.е. возвращать ссылку на вставленный объект не надо — в коде дальше она использоваться не будет.
Возможно, компромиссным вариантом действительно является вариант когда гасится в методе exception по нарушению constraint, остальные же исключения — выбрасываются наружу.
Re: Стоит ли в данном случае генерировать исключение
От: Константин Л. Франция  
Дата: 17.10.08 11:55
Оценка:
Здравствуйте, Serge_HID, Вы писали:

[]

bool AddItem(...)
Re: Стоит ли в данном случае генерировать исключение
От: russian_bear  
Дата: 17.10.08 18:21
Оценка: +4
S_H>Мой вопрос касается метода addItem(Item item): стоит ли выбрасывать наружу исключения если такой item в БД уже существует.

ИМХО лучше всего так: в методе, где идет именно сам SQL запрос (в Data layer) надо кинуть исключение. В Business Service Layer это исключение обработать, записать как Error или Warning и по необходимости вернуть true/false.

S_H>С одной стороны не очень удобно каждый раз заключать в try/catch блок с вызовом addItem, с другой — гасить исключение внутри метода ИМХ тоже нехорошо.


На Data уровне лучше не гасить.
Re[3]: Стоит ли в данном случае генерировать исключение
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 18.10.08 01:48
Оценка:
Здравствуйте, Serge_HID, Вы писали:

ГВ>>Зависит от того, что считается постусловием операции addItem. Если постусловие — вставка указанного объекта (и её последствия, например — захват ссылки на объект), то кидаем исключение или возвращаем false, то есть каким-то образом сигнализируем о том, что постусловие не выполняется. Если постусловие — такое состояние агрегата, что он содержит объект эквивалентный item, то исключения имеют смысл, если произошло нечто, не связанное с состоянием агрегата: например, оборвалась связь с сервером БД, не хватило места на диске и т.п.


Есть ещё одна ошибочная ситуация — когда ты пытаешься дублировать ключ не дублируя содержимое. В этом случае, по идее, нужно воспользоваться каким-нибудь updateItem, а не addItem.

S_H>В принципе в данном случае постусловия как такого нет, т.е. возвращать ссылку на вставленный объект не надо — в коде дальше она использоваться не будет.


Ну как это — нету постусловия? Есть оно, никуда не делось: агрегат содержит объект, эквивалентный item. Это и есть постусловие addItem. Осталось доопределить "эквивалентность".

S_H>Возможно, компромиссным вариантом действительно является вариант когда гасится в методе exception по нарушению constraint, остальные же исключения — выбрасываются наружу.


constraint constraint-у рознь. Ты можешь гасить в методе только один тип нарушений — попытку полного дублирования элемента. Но могут быть и другие ограничения целостности. Так что, в исходном сообщении я был не совсем прав — слишком сузил набор возможных ошибок.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.