| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Каждому классу свой тип исключения! |
| Автор: Kipter 24.2.2010, 23:48 | ||||||||||
| Суть такова.... У каждого класса есть свой набор всевозможных ошибок которые могут происходить в его функциях. например...
Класс-исключение для всех классов вообщем то по коду одинаков и тупо копипастить его для каждого класса было бы наверное глупо. Однако использовать его для всех классов не приемлемо ибо будут совпадать коды ошибок а в каком классе именно произошло исключение будет неясно.
используется как
тогда я сделал так
Собственно смущает вопрос правильности подхода... поидее для каждого класса генерируется код еще под один конструктор нового типа исключения, да и пришлось использовать макро-определение..... Да и думаю не ожидают ли подводные камни.... есть идеи? P.S: Не хватает оператора что то вроде typedef но который бы делал не ассоциацию типа а вводил новый тип но только для правил компилятора =) |
| Автор: mes 25.2.2010, 00:16 |
| почитайте про шаблоны (template<>) |
| Автор: Kipter 25.2.2010, 00:50 |
Хе-хе, про шаблоны знаю.... но не получу ли я ими еще более излишнюю кодогенерацию? тогда для каждого класса будет сгенерирован не только излишний конструктор но и функции члены! получим еще больше лишнего коду ради "удобства" Да и ктомуже синтаксис красивше не станет! я бы сказал появится даже больше нагромождений. Преимущество будет только в проверке типов, в макрос то можно всевозможную дряно пихать, но с другой тсороны ошибку получим сразу, взглянем на макрос и все поймем. |
| Автор: Kipter 25.2.2010, 01:20 | ||||
Хе-хе, про шаблоны знаю.... но не получу ли я ими еще более излишнюю кодогенерацию? тогда для каждого класса будет сгенерирован не только излишний конструктор но и функции члены! получим еще больше лишнего коду ради "удобства" Да и ктомуже синтаксис красивше не станет! я бы сказал появится даже больше нагромождений. Преимущество будет только в проверке типов, в макрос то можно всевозможную дряно пихать, но с другой тсороны ошибку получим сразу, взглянем на макрос и все поймем. Добавлено через 12 минут и 15 секунд Вот вариант с использование Специализированных шаблонов о которых говорил mes ссори за грязное исполнение в одном фаиле и реализацией по месту объявления, просто так быстрее =)
Собственно что дает? Убили макроопределение.... С шаблонами есть типо как проверка типов, случайно не сунешь левый тип =) (реализация увы неполная поэтому в данном примере сунешь) Но с другой стороны сунув левый тип в макро - тоже ошибку получишь, глянешь в макрос и все поймешь + можно комменты к нему накидать. В плане кодогенерации получаем тоже самое что и с макросом + код конструктора каждому классу. Но теперь нам необходимо выкидывать исключения вот так: throw XException<HTTPClient>("HTTP", 3); заместо возможного throw XException("HTTP", 3); c макросом. и писать перед каждым классом
можно конечно сунуть в макро-определение, но опять таки получим масло масленое, за что боролись на то и напоролись оО Вообщем пока что такой вариант мне не приглядывается - выигрыша мало, нагромождения есть. |
| Автор: Kipter 25.2.2010, 02:05 |
| mes, Чорт, действительно, красива.... Надо высыпаться то то бредни в голову к вечеру лезут. Спасибо++ |
| Автор: bilbobagginz 25.2.2010, 23:06 |
| mes, а зачем сразу шобло ны ? может лучше просто создать базовый классик. с частично виртуальными методами. а в сыновьих классах эти виртуалки реализовать в соответствии с требованиями. я не знаю что выгоднее - шаблоны или наследование ? UPD: сначала я понял будто у каждого из классов будут особенные эксепшены, разных типов - разным количеством данных на выходе, разными what(), и т.п. а сейчас взглянул на примеры, и получается, что никаких принципиально разных эксепшенов ему тут не надо. можно обойтись действительно с шаблонами... довольно читабельно, и ручками писАть меньше. |
| Автор: Lazin 25.2.2010, 23:19 |
а вот зачем интересно обычно для каждого класса не нужно городить свой класс исключения, все равно в большинстве случаев будешь ловить через std::exception |