![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Dray |
|
|||
![]() Материалист ![]() ![]() Профиль Группа: Участник Сообщений: 652 Регистрация: 7.10.2003 Где: г. Всеволожск Репутация: 2 Всего: 6 |
Например у меня есть класс в котором хранятся числа в каком-то диапазоне. И в случае если кто-то попытается записать число вне диапазона, я хочу кинуть исключение. Как обычно принято делать: создать свой класс-исключение или кидать какое-нибудь стандартное, например out_of_range?
|
|||
|
||||
Xenon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
Dray, ну ты можешь просто кинуть исключение throw "Error", можешь не создавать класс. Но если тебе ничего не нужно, кроме надписи "Error", то класс не создавай. Если же нужно передать нечто большее, тогда создавай класс.
PS. Блин, бред написал - исправляю Это сообщение отредактировал(а) XenonSk - 5.7.2006, 20:39 |
|||
|
||||
En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: 1 Всего: 20 |
Dray
Если хочешь мнение, то я бы не стал возвращать в твоем случае false, 0, NULL, минимум - вернул бы enum ErrType{...}; Исключение вообще не стал бы кидать. Просто заведи в классе тот же enum ErrType{NO_ERROR=0,OUT_OF_RANGE=-100}; В каждом методе возьми за привычку(если это не void) возвращать ErrType и получишь практически "бесплатный" расширяемый класс(можешь кроме OUT_OF_RANGE и ещё что-нибудь добавить). Ибо исключение - это всё же дорогое удовольствие, может так получиться, что некий(знаю парочку ![]() Добавлено @ 18:53 Кстати, кто-нибуль тестировал на скорость обработку(+перхват) исключения и сравнивания значений двух переменных ? Что-то мне подсказывает, что второе явно быстрее. Это сообщение отредактировал(а) En_t_end - 5.7.2006, 18:54 |
|||
|
||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
En_t_end, с таким подходом проще всего писать все на чистом Си (спасибо, что не на ассемблере).
Правильно подсказывает ![]() -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
En_t_end |
|
||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: 1 Всего: 20 |
Void,
Если бы в чистых Сях была бы поддержка ООП, да шаблоны, то я бы писал именно на них. Но тогда это были бы не Cи ![]()
Ладно... согласен. Но все же для портируемости лучше юзать перечесление... К тому же, что чисто психологически делать проще ?
или:
Меня пугает множество фигурных скобок. ЗЫ Скобки, скобки, скобки... вложенности, много вложенностей, они, они,идут за мной(после Макконелла я не люблю вложенности, скобки и всё что с ними связанно). Добавлено @ 20:46 Void, А вот умеет у тебя механизм отлова исключений действовать так ? ![]()
Это сообщение отредактировал(а) En_t_end - 5.7.2006, 20:49 |
||||||||||
|
|||||||||||
Xenon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
En_t_end, Но зато, если нормально продумать ... Надо будет тебе, допустим, изменить сообщение об ошибки - меняешь только в catch блоке и все. И централизация.
|
|||
|
||||
En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: 1 Всего: 20 |
XenonSk,
что-то я не пойму, где децентрализация, при использовании перечеслений ? Добавлено @ 20:56 XenonSk, Надо мне будет изменить сообщение об ошибке я прежде всего изменю его в константных полях, а если надо заюзать новое сообщение, то изменю одну или две строчки в case блоке. |
|||
|
||||
Xenon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
En_t_end, ну просто, допустим, у тебя 8 методов, в которых может произойти одна и таже ошибка. По-мойму проще будет изменить в catch Одну сторку, чем там в каждом методе менять.
А централизациия - в смысле обработка ошибок в одном месте ... |
|||
|
||||
DeadSoul |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1217 Регистрация: 25.9.2005 Где: Москва Репутация: 2 Всего: 11 |
С каких пор исключения стали непереносимыми? Не надо учить других своей ненависти к исключениям -------------------- Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". Бьем спамеров их же оружием. Пусть весь спам сыпется им [email protected] |
|||
|
||||
Fazil6 |
|
||||||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
и тем самым заставить каждый раз при вызове метода класса проверять, что вернули????!!!!! Очень интересно. А если я забуду проверить? А если после меня кто-то будет этот код сопровождать? Хорошо, проверил я и вижу, что мне вернули ошибку. Дальше что? Самому по этапу передавать наверх? А там проверят и дальше ошибку возвратят? Так вся программа превратится в сплошной if-else. Исключение нужно для обработки ошибки не там, где она возникла, а там, где ее можно и нужно обработать. En_t_end,
ты это серьезно?
причем самый главный витамин в том, что throw RangeError(); совсем не обязательно кидался в class_obj.Metod(), а где-нибудь в глубинах кода, вызываемого в ней и не надо без конца проверять где и что вернулось. XenonSk,
это неправильно. Никогда не надо так делать даже если это работает. Всегда нужно создавать объект исключения. |
||||||||
|
|||||||||
Dray |
|
|||
![]() Материалист ![]() ![]() Профиль Группа: Участник Сообщений: 652 Регистрация: 7.10.2003 Где: г. Всеволожск Репутация: 2 Всего: 6 |
||||
|
||||
Fazil6 |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
эта моя фраза относится в первую очередь к throw "Error", а свое или нет это от ситуации зависит. если не надо информацию передавать, а только сигнализировать, то сойдет и пустой класс
сдругой стороны учитывай как и где исключения будут обрабатываться. Если обработка для разных эксепшенов одинаковая, то может быть нет смысла для каждой ошибки генерить отдельное исключение, а использовать какое-то одно. Если ты хочешь в объекте исключения передавать какие-то данные и несколько, то здесь без своего класса трудно обойтись. А бывают ситуации когда идет какая-то обработка данных и при ошибках надо просто прервать работу сообщив что где не так , тут и std::runtime_error вполне сгодится и писать что-то свое совсем не обязательно |
||||
|
|||||
En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: 1 Всего: 20 |
Fazil6,
Ептс... конечно... видимо воображение у меня слабова-то ![]()
Я не уверен, но в бизнес-проектах, насколько мне известно, документируют каждый метод от сих до сих. К тому же не увидеть, что метод возвращает ErrType или тому подобную вещь, с приставкой Err - просто невозможно, бросается в глаза. И к тому же я не говорю о том, чтобы использовать перечесление, как способ сигнализации об ошибке только в одном методе. Когда ты примешь эту концепцию во всём классе, библиотеке классов, то никаких проблем с вижу-не вижу,отлавливаю-не отлавливаю ИМХО быть не должно. Далее... почему ты думаешь, что с исключениями дела обстоят лучше ? Человек также может не заметить, что метод может бросать некое исключение и не сделать вокруг него try{}catch()catch(...) - ТАК что тут у исключений и перечеслений одинаковые шансы на нерадивого программиста. Они наоборот СТАЛИ переносимыми только с некоторых пор. |
|||
|
||||
takedo |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: 1 Всего: 3 |
в данный момент я согласен с En_t_end, потому что считаю удобным сделать вообще в енуме NotError = 0, и когда функция выполняется делать так:
Если же у нас исключение, то надо эту функцию обрамлять в трай сатч, что не всегда удобно. Добавлено @ 08:31 да, кстати, чуть не забыл: ![]() ![]() -------------------- я не гольфист - я хоккеист |
|||
|
||||
Fazil6 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
En_t_end,
у меня такое чувство, что ты слабо себе представляешь о чем дискутируешь. Кто тебе сказал, что каждую функцию, бросающую исключения обязательно надо обрамлять в try ? try ставится там, где будет обрабатываться ошибка, а не там где вызывается функция бросающая исключение и по объекту исключения определяется что произошло, где и как на это реагировать. а вот в вопросе про забывчивость программиста исключение сразу покажет что произошло и скажет сама, что она работает неправильно и даже пускай рухнет. Эту ошибку исправят за 5 минут. А непроверенный возврат позволит программе работать дальше, возможно никто вообще не заметит, что программа работает неправильно, выдает неверные результаты, которые выглядят вполне логичными, через месяц кто-то что-то заподозрит, еще через месяц поисков возможно кто-то и найдет вчем баг, когда программа "иногда почему-то глючит". На самом деле эксепшены - лучшие друзья программиста. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |