![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
ptr |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 661 Регистрация: 31.5.2006 Где: Новосибирск Репутация: 1 Всего: 14 |
Не вижу ничего неудобного. В случае try/catch мы сразу видим, что внутри порождается исключение, а в твоём случае непонятно что возвращается. Да и кроме того, что если функции надо возвращать какие-то значения?
Не намного то и дороже. Полностью согласен. -------------------- Единственный способ определить границы возможного - это выйти за эти границы, в невозможное. Артур Кларк. |
||||
|
|||||
Fazil6 |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
это вообще детский сад какой-то. Главное удобство состоит не в том, что надо писать try (а его можно не писать здесь) а в том, что эксепшен не заставляет нас обрабатывать ошибку здесь, а код возврата заставляет именно здесь. Как наверх передать, что функция не отработала? Эксепшеном? так почему было сразу не кинуть throw? Вернуть отсюда опять код ошибки и там обработать? а там вернут опять код ошибки и опять будут проверять и возвращать? А если твоя Func() вызывает функции, которые вызывают другие функции, которые вызывают еще функции, а те вызывают еще функции и т.д. и каждая может неотработать и вернуть ошибку? Каждый вызов проверять что вернули? Это дешевле? То, что Func возвращает 0 ничего не говорит о том, что произошло и где и как на это реагировать. Для того чтобы это обеспечить нужно возвращать разные коды, а это превратит твой if в мало понятный и уродливый if - else - if - .... или switch . Я как представлю, брр... На самом деле эксепшены - лучшие друзья программиста. |
||||
|
|||||
Dray |
|
|||
![]() Материалист ![]() ![]() Профиль Группа: Участник Сообщений: 652 Регистрация: 7.10.2003 Где: г. Всеволожск Репутация: 2 Всего: 6 |
Эксепшены - вещь хорошая тут спорить несчем. Насчет выбора исключения я все понял, спасибо всем.
|
|||
|
||||
En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: 1 Всего: 20 |
Fazil6
Я думаю это вопрос религии. И да, действительно, я не знаю о чем говорю, потому что ни разу не встречался с более менее сложной структурно задачей. Но в мелких проектах у меня есть и перечисления и исключения, поэтому всё же я могу сравнить. Я предпочитаю перечисления("В г%вне, да не в обиде"(с)) |
|||
|
||||
takedo |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: 1 Всего: 3 |
Fazil6, логично говоришь... и я с тобой во многом согласен, но почему в виндовс повсюду используется GetLastError()?. А возвращает она несколько тысяч разных вариантов, наверное "неудобно" обрабатывать несколько тысяч исключений? А так ::AfxMessageBox("%d",номер ошибки);- можешь ассоциировать строку с номером. И считай все рассказал, почему и зачем ошибка.
Все надо делать в меру. ![]() Добавлено @ 18:03 Fazil6,
Как сказал En_t_end, и фраза хороша:
![]() -------------------- я не гольфист - я хоккеист |
||||
|
|||||
_hunter |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
потому как писалась она на простом C. причем мнногие ее за эту "удобность" жутко ненавидят.
так и ты в коде вряд ли все возвращаемые значения обрабатываеш -- хорошо если десяток... -------------------- Tempora mutantur, et nos mutamur in illis... |
||||
|
|||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Потому что WinAPI никакого отношения к C++ не имеет и бросать C++-исключения тоже не умеет. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: 1 Всего: 20 |
ОФФТОП...
Я думаю, если бы даже винда умела это делать, это превратилось бы в очередной бардак. Еще по исключениям...они кстати имеют goto-начало(Уолтер Савитч "Программирование С++")... я ещё пристально не смотрел дизассемблером, но мне кажется, если сравнить goto и try-catch в ассемблерном листинге, то можно найти много общего. И вообще, кого я читал, все пишут, что с исключениями надо обращаться внимательно и кидать их направо и налево не стоит. Вообще, как тут уже говорили - исключения, исключительно для исключительных операций, и хоть не обязательно, но программа после выброса должна завершиться.... ибо я себе просто не представляю, как после нескольких десятков(наверное в крупном проекте их будет и больше) goto-подобных переходов,программа может нормально функционировать. |
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
Как раз в этом то и преимущество исключений, что после их обработки можно продолжить выполение программы. Раскрутка стека со стороны компилятора, правильное упраление памятью и "правильные" деструторы со стороны разработчика - помогут не упасть программе. Попытаться востановиться после сбоя - это задача для грамотно спроектированного приложения. Не всегда получается, но всё же. |
|||
|
||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
En_t_end, скажем так, и goto и исключения являются разновидностями continuations.
А у if и goto в ассемблерном листинге меньше общего? Тем более механизмы реализаций исключений зависят от компилятора. MSVC так вообще пользуется сервисами ОС для этого. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
Fazil6 |
|
||||||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
если хотите, идемте в холивары. Модеры вполне могут перенести тему.
Ничего общего. Даже по смыслу, не то что по реализации. Первый раз встречаю мысль когда goto сравнивают с исключениями. Исключения - механизм обсолютно предсказуемый и понятно работающий в отличии от goto.
я скажу еще категоричнее это совершенно другой язык программирования
что в этом плохого что она завершится? Что хорошего, когда программа продолжит работать если правильно она работать не может? а вот и ответ
нету там никаких goto, а есть раскрутка стека и в месте обработки состояние переменных абсолютно однозначно предсказуемо Попробуйте подходить к разработке программы не с позиции обеспечения в первую очередь устойчивой работы, а с позиции когда программа чуть что - бросает исключение и ложится набок с криком "ошибка такая-то в такой-то строке, потому, что индекс масива меньше нуля". Как не дико это выглядит для некоторых, но после буквально первой компиляции и запуска вашей программы Вы отловите столько багов за 30 минут тестирония!!!! причем иногда в таких местах, где вам и в голову не могло прити проверить или где дебагером проблематично проверить. Это иногда называют самотестируемое ПО. А теперь представьте приходит письмо от заказчика "классная программа все зае..сь, но какая-то хрень. На прошлой неделе по программе Петров отработал 2 часа, а он клянется на полный рот казявок, что 8 отработал. В прошлом месяце такаяже хрень была с Сидоровым и Ивановым. Мы их конечно послали подальше, но вчера она так насчитала генеральному тов. Л.Трубецкому. Разберитесь в чем дело. Мы же за программу Вам 100 баксов заплатили." Вот Вам прелести сопровождения... А если серьезно,то я не увидел в этом топике никаких аргументированных мыслей по поводу того, что исключение имеют недостатки. Ах да! Каюсь. Грешен. Как же я мог забыть!!!!!! Ведь для отлова исключения надо писать try, а это не всегда удобно... Про эфективность еще вспомнили... Эксепшены - это дорого. Не дороже проверок, зато надежнее На самом деле эксепшены - лучшие друзья программиста. |
||||||||
|
|||||||||
En_t_end |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: 1 Всего: 20 |
Я был бы очень рад, если бы смог научиться проектировать именно такие приложения. Если в программе, написанной для робота-исследователя Марса(к примеру) будет допущена ошибка, то, если в её случае канал связи оборвется(робот выключиться), то будут потерянны миллионы. Программа робота должна сама восстановиться, или минимум отключить модуль, в котором обнаруженна ошибка. С исключениями это будет проблематично. После catch-отлова нескольких взаимосвязанных багов, нужно будет применить довольно много методов для возвращения к нужной позиции. Кстати скорее всего придется использовать go to. Согласен, но выпускать такое ПО к заказчику нельзя. Кстати, какая польза от раскрутки стека, если, к примеру, я память в большинстве случаев из кучи использую ? Добавлено @ 06:58 Не знаю, может эта мысль родилась только в голове у Савитча, но мне почему-то кажется, что это не так.
Никто не спорит, но вот само прыгания из любого места программы вызывает опасения. |
||||
|
|||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Любая программа может и должна работать устойчиво к исключениям. И нет тут ничего эзотерического. Скажем, нужно открыть файл. Идем в меню, Open, выбираем файл, а файл... не тот. Скажем, какой-то умник переименовал tif в bmp ... Или просто в двоичном редакторе пошалил... или система упала в момент записи... И что, аварийно завершаться? Даже не смешно. Приличная программа должна сказать "вас здесь не стояло" и нормально продолжаться.
И это относится к чему угодно: запустили проверку, ну не знаю, правописания, в набитом тексте. Что-то там не сошлось (34 буква алфавита обнаружилась, или язык внезапно стал албанским, или просто памяти не хватило, или...). Очевидно, что завершиться должна только эта конкретная функция, да так, чтобы остальная часть программы не пострадала, и можно было продолжать работу. С помощью исключений это реализовать несложно - нужно только придерживаться определенной дисциплины. А насчет использования кучи - так на то есть техника "Выделение ресурса есть инициализация", уже давно с бородой. -------------------- ... |
|||
|
||||
likehood |
|
|||
666 ![]() ![]() Профиль Группа: Участник Сообщений: 536 Регистрация: 21.12.2005 Репутация: 8 Всего: 24 |
||||
|
||||
Fazil6 |
|
||||||||||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
En_t_end,
не путайте божий дар с яичницей. Мы говорим не об ошибке, а о сигнализации об ошибке и доводы типа забыли поставить try-catch в расчет не принимаются. En_t_end,
как раз с исключениями проще всего
ржунимагу. Какое goto, какая позиция? Идея обработки исключения заключается в том, что с помощью исключения мы автоматически попадаем туда, где мы можем правильно восстановиться после ошибки. Куда еще нужно переходить?
Какое нельзя? Тщательно протестированное?
boost::shared_ptr tr1::shared_ptr std::auto_ptr Earnest,
Я же не говорю, что исключения надо бросать и не обрабатывать. Можешь восстановиться - продолжай себе работать. Я нигде не сказал, что по любому эксепшену надо аварийно завершаться. |
||||||||||||
|
|||||||||||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |