|
|
|
Исключения: за и против
|
|||
|---|---|---|---|
|
#18+
MasterZiv> это еще один момент который меня просто убивает в идеалогии исключений. > Зачем мне исключение сгенерированое драйвером железа если я пишу гуй? > Ошибка произошедшая на одном уровне должна быть обработана на этом же > уровне или в крайнем случае на следующем уровне. Поднимать ее выше > можно, но не правильно. В рамках обоих техник можно поднимать или не поднимать ошибки до любого уровня. Поднимается ошибка или нет - зависит от предметной области и правильности реализации софта.Да, можно поднимать или не поднимать. Но по умолчанию исключения поднимаются. Когда я из своей процедуры вызываю функцию с кодом возврата, я сам решаю игнорировать этот код или нет. Если его надо обработать - я прописываю как именно его надо обрабатывать. А с исключениями мне всегда приходится их обрабатывать или надеятся что кто-то там, вызвавший мою процедуру правильно обработает исключение брошеное функцией. > А почему это "скриптовые языки не берем"? А потому что серьезные проекты на них не пишут. Ну ладно, фиг с ними, пусь будут.[/quot]Ну да, веб-сайты уже серьезными проектами не считаются :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2007, 00:10 |
|
||
|
Исключения: за и против
|
|||
|---|---|---|---|
|
#18+
MasterZiv А потому что серьезные проекты на них не пишут. пишут ещё как! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2007, 00:11 |
|
||
|
Исключения: за и против
|
|||
|---|---|---|---|
|
#18+
White OwlЗачем мне исключение сгенерированое драйвером железа если я пишу гуй? Ошибка произошедшая на одном уровне должна быть обработана на этом же уровне или в крайнем случае на следующем уровне. Поднимать ее выше можно, но не правильно.Забавно. Как вы, к примеру обработаете на уровне железа отказ при записи на диск? Или сбой канала связи? Ни как! Единственный способ обработать фатальную ошибку, это передать ее наверх, чтобы приложение могло предупредить пользователя, что что-то пошло не так, и предоставить диагностическую информацию для передаче службе поддержки или записи в лог. Все нефатальные ошибки (т.е. которые можно разрулить без вмешательства пользователя) железом и так обрабатываются. White OwlА то в итоге ты можешь доподниматься до того что рисуя клиента к базе данных, и в диалоге "сохранить запись, да/нет" ты будешь обрабатывать ошибки tcpip стека. Либо будешь ловить родителя всех исключений, какой-ниубдь std::exception или ему подобноеИ как же вы поступите, если будете обрабатывать ошибки вручную? Вам же все равно их придется обрабатывать. Механизм исключений, по сути, не вносит никаких принципиальных изменений в стратегию обработки ошибок. Они только упрощают это дело. White Owlобрабатывать общую ошибку без разбора что там в действительности произошло.Опять таки, как вы будете разбирать, что там произошло? Ну вот вернул вам send() значение SOCKET_ERROR. И что дальше? Что тут будем разбирать? White OwlДа, можно поднимать или не поднимать. Но по умолчанию исключения поднимаются. Когда я из своей процедуры вызываю функцию с кодом возврата, я сам решаю игнорировать этот код или нет.На каком основании вы позволяете себе проигнорировать ошибку? В подавляющем большинстве случаев их игнорировать нельзя. White OwlА с исключениями мне всегда приходится их обрабатывать или надеятся что кто-то там, вызвавший мою процедуру правильно обработает исключение брошеное функцией.При ручном контроле за возвращаемыми кодами ошибок вам тоже придется их всегда обрабатывать. В случае исключений достаточно один раз написать блок catch(), иногда один на все приложение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2007, 09:59 |
|
||
|
Исключения: за и против
|
|||
|---|---|---|---|
|
#18+
White Owl пишет: > Да, можно поднимать или не поднимать. Но по умолчанию исключения > поднимаются. Кто тебе сказал это ? Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2007, 10:03 |
|
||
|
Исключения: за и против
|
|||
|---|---|---|---|
|
#18+
White Owl пишет: > Да, можно поднимать или не поднимать. Но по умолчанию исключения > поднимаются. Когда я из своей процедуры вызываю функцию с кодом > возврата, я сам решаю игнорировать этот код или нет. Если его надо > обработать - я прописываю как именно его надо обрабатывать. А с > исключениями мне всегда приходится их обрабатывать или надеятся что > кто-то там, вызвавший мою процедуру правильно обработает исключение > брошеное функцией. Так, кажется с тобой все понятно, ты просто не понимаешь идеологию исключений и как они должны работать. Так вот, с исключениями ты можешь делать ровно то же самое. Единственная проблема в том, что язык С++ не заставляет специфицировать все исключения функции (но тем не менее они могут быть указаны) и ты не видишь иногда, какие исключения тебе надо обрабатывать. Это в общем случае должно быть указано в документации на функцию (но может быть и в коде) и зависит от того, насколько хорошо поставлена технология программирования и документирования в данной конторе, которая разрабатывает код. Но самое главное не в этом, а в том, что при использовании кодов возвратов мы наблюдаем ту же самую проблему - не все коды возвратов могут быть описаны, и ты можешь запросто не знать половины из них и неправильно их обрабатывать. Так что в этом смысле ситуация ну ничем не отличается. Собственно идеология исключений и заключается в том, что функция получает еще один канал общения с окружающим ее миром, помимо возвращаемого значения и входных/выходных параметров. Причем информация, получаемая из функции по этому каналу может быть обработана ГДЕ УГОДНО, а не только в месте вызова этой функции. > Ну ладно, фиг с ними, пусь будут.[/quot] > Ну да, веб-сайты уже серьезными > проектами не считаются :) Не считаются однозначно. Причем серьезные сайты не пишут на скриптовых языках, типа перла и PHP. Ладно, не важно. Ты мне примеров языков БЕЗ исключений так и не привел. C, FORTRAN ? Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2007, 10:16 |
|
||
|
Исключения: за и против
|
|||
|---|---|---|---|
|
#18+
daevaorn пишет: > А потому что серьезные проекты на них не пишут. > пишут ещё как! Примеры давай. Проект, язык. Я в общем-то не против т.н. динамических языков, а очень даже за, я хотел отмести языки типа Perl и bash shell script. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2007, 10:19 |
|
||
|
Исключения: за и против
|
|||
|---|---|---|---|
|
#18+
roman10 пишет: О! Союзнег поивилси ! Классно ! > И как же вы поступите, если будете обрабатывать ошибки вручную? Вам же > все равно их придется обрабатывать. Механизм исключений, по сути, не > вносит никаких принципиальных изменений в стратегию обработки ошибок. > Они только упрощают это дело. Золотые слова! +1 > White Owl > Да, можно поднимать или не поднимать. Но по умолчанию исключения > поднимаются. Когда я из своей процедуры вызываю функцию с кодом > возврата, я сам решаю игнорировать этот код или нет. > > На каком основании вы позволяете себе проигнорировать ошибку? В > подавляющем большинстве случаев их игнорировать нельзя. Не, может быть можно и проигнорировать ошибку. Например, при сбое диска записать на другой. Но это зависит от приложения целиком и полностью. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2007, 10:23 |
|
||
|
Исключения: за и против
|
|||
|---|---|---|---|
|
#18+
ErV blindedМы несколько отклонились от темы. Вообще-то разговор шел об исключениях. И мне кажется что при правильном их использовании код значительно упрощается. Во всяком случам получившаяся LoadLevelFromХ выглядит значительно менее устрашающе чем исходный вариант, я не говорю об обертке. А что касается библиотеки DirectX я с ней не пересекаюсь, ибо живу на Unix'e. Простите, исходный вариант использовал исключения - макрос HRCHECK бросал производный мой собсвтенный класс исключения, который нес в себе информацию об имени функции, строке, и файле, где произошла ошибка... Да конечно, только вот функциякоторую вы привели ничего от наличия исключений не выиграла, ну разве что исключение несло информацию о строчке кода где оно было сгенерировано. ErV А получившийся ваш вариант (ничего личного) для меня лично выглядит "более устрашающе" по ряду причин... Интересно почему? Неужто такой страшный? Тут мы в прошлом годе про фабрики обсуждали, вот там действительно страшный, а здесь все понятно... ErV Пример я привел так как меня давно этот вопрос интересовал, и здесь он был "в тему" в том числе как вариант проблемы не обязательно привязанной к DirectX и Win32... Вообще, стандартному C++ , ИМХО, не хватает модели try{...}catch(){..}finally{...}... О вот тут -то выи не правы.finall нуже только при использовании сборщика мусора, если им не пользоваться то можно и без него обойтись.Время жизни объекта в С++ точно определено и освобождение ресурсов совершенно безболезненно можно связать с деструктором, что собстенно у меня и сделано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2007, 11:20 |
|
||
|
Исключения: за и против
|
|||
|---|---|---|---|
|
#18+
White Owl blindedА вот что касается лапши - ну не согласен, категорически, каждый класс имеет свою отвественностьи все ясно и понятно, есть файл с объектами, есть перечисление по нему, элемет данных. У каждого класса свой конструктор и деструктор... И вообще это все должно быть разнесено по разным файлам и даже библиотекам...А там вообще классы нужны? А темплейты? Ну чтобы Hello world! нарисовать, классы тоже не нужны. Вопрос в контексте. Скорее всего функция вырвана из контекста и там наличие классов оберток сыграло бы свою роль. А что касается шаблонов, тоэто уж вопрос техники прграммирования, у меня во с ними хорошо, как впрочем и с классами, я их и использую. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2007, 11:28 |
|
||
|
Исключения: за и против
|
|||
|---|---|---|---|
|
#18+
blinded ErV Простите, исходный вариант использовал исключения - макрос HRCHECK бросал производный мой собсвтенный класс исключения, который нес в себе информацию об имени функции, строке, и файле, где произошла ошибка... Да конечно, только вот функциякоторую вы привели ничего от наличия исключений не выиграла, ну разве что исключение несло информацию о строчке кода где оно было сгенерировано. По-моему, вы упустили тот момент, что ошибка могла произойти на довольно глубоком уровне вызова а отлов брошенного исключения позволял нормально освободить ресурсы в функции, вызвавшей функцию, вызвавшей функцию (повторть нужное чило раз) вызвавшей то, что я привел в примере... blinded ErV А получившийся ваш вариант (ничего личного) для меня лично выглядит "более устрашающе" по ряду причин... Интересно почему? Неужто такой страшный? Тут мы в прошлом годе про фабрики обсуждали, вот там действительно страшный, а здесь все понятно... Возможно, это дело вкуса. Просто, ИМХО, написание оберток как раз в этом случае будет пустой тратой времени, так как особенной в них потребности нет. Т.е. - можно написать программу, работающую и без оберток, и выглядеть и читаться она будет нормально. Обертки (опять же, ИМХО) конкретно здесь будут только запутывать программную логику. Я не думаю, что в этом случае кто-то кроме автора в "обильно обернутом" коде сможет разобраться быстро и сразу. ООП/оборачивание каждого интерфейса, ИМХО, должно применяться к месту, и это не тот случай. В данный момент оборачивание не добовляет никакой особо важной жизненной функциональности. Я понимаю случай, когда оборачивается IDirect3DBaseTexture9 с целью предотвращение дублирования ресурсов и загрузки одной текстуры дважды. Понимаю, когда оборачивается IDirectSoundBuffer, делается базовым классом, от которого поизводятся уже классы OggSound, StreamSound, WavSound и т.д. ППонимаю, когда берется пачка интерфейсов IDirect3D9 IDirect3DDevice9 и оборачивается в систему, которая представляет собой функциональный менеджер экрана, отвечающий за корректную очистку ресурсов при потере устройства, смене разрешений экрана и т.д. и т.п. Т.е. - я понимаю оборачивание, когда добавляется функциональность, изначально в интерфейсе/интерфейсах отстутсвующая. Но в этом примере, извините, не вижу в обертке смысла. Новой функционлаьности нет, соотвтетсвнно, будет пустая трата ресурсов, чтобы в результате получить то же самое, что и было, только код будет медленнее, больше, неудобнее, кривей и непонятнее... blinded ErV Пример я привел так как меня давно этот вопрос интересовал, и здесь он был "в тему" в том числе как вариант проблемы не обязательно привязанной к DirectX и Win32... Вообще, стандартному C++ , ИМХО, не хватает модели try{...}catch(){..}finally{...}... О вот тут -то выи не правы.finall нуже только при использовании сборщика мусора, если им не пользоваться то можно и без него обойтись.Время жизни объекта в С++ точно определено и освобождение ресурсов совершенно безболезненно можно связать с деструктором, что собстенно у меня и сделано. finally удобно использовать, когда требуется блок, который 100% будет выполнен, как в том случае, когда исключение будет, так и в том, когда его не будет. В случае с использованием try{}catch(){} мне пришлось дублировать блок очистки ресурсов, а это, во-первых, некрасиво, во-вторых, это светит глюками... В случае, если бы был finally, мне этот блок очистки пришлось бы писать только один раз. Причем тут сборщик мусора? Поставить очистку после catch - тоже не вариант, так как внутри catch я вполне могу решить кинуть исключение дальше... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2007, 12:21 |
|
||
|
Исключения: за и против
|
|||
|---|---|---|---|
|
#18+
ErV По-моему, вы упустили тот момент, что ошибка могла произойти на довольно глубоком уровне вызова а отлов брошенного исключения позволял нормально освободить ресурсы в функции, вызвавшей функцию, вызвавшей функцию (повторть нужное чило раз) вызвавшей то, что я привел в примере... Да нет не упустил, я так же нормально освобождаю ресурсы.. деструкоры автоматических прееменных при генерации исключения будут отработаны, все ресурсы будут освобождены blinded ErV Возможно, это дело вкуса. Просто, ИМХО, написание оберток как раз в этом случае будет пустой тратой времени, так как особенной в них потребности нет. Т.е. - можно написать программу, работающую и без оберток, и выглядеть и читаться она будет нормально. Обертки (опять же, ИМХО) конкретно здесь будут только запутывать программную логику. Я не думаю, что в этом случае кто-то кроме автора в "обильно обернутом" коде сможет разобраться быстро и сразу. ООП/оборачивание каждого интерфейса, ИМХО, должно применяться к месту, и это не тот случай. В данный момент оборачивание не добовляет никакой особо важной жизненной функциональности. Я понимаю случай, когда оборачивается IDirect3DBaseTexture9 с целью предотвращение дублирования ресурсов и загрузки одной текстуры дважды. Понимаю, когда оборачивается IDirectSoundBuffer, делается базовым классом, от которого поизводятся уже классы OggSound, StreamSound, WavSound и т.д. ППонимаю, когда берется пачка интерфейсов IDirect3D9 IDirect3DDevice9 и оборачивается в систему, которая представляет собой функциональный менеджер экрана, отвечающий за корректную очистку ресурсов при потере устройства, смене разрешений экрана и т.д. и т.п. Т.е. - я понимаю оборачивание, когда добавляется функциональность, изначально в интерфейсе/интерфейсах отстутсвующая. Но в этом примере, извините, не вижу в обертке смысла. Новой функционлаьности нет, соотвтетсвнно, будет пустая трата ресурсов, чтобы в результате получить то же самое, что и было, только код будет медленнее, больше, неудобнее, кривей и непонятнее... В данном конкретном примере наверное все что я сделал может показать лишним. Но опять повторяю все зависит от контекста. Ежели писать Hello world то нет необходимости изобретать iosteam. Что же касается обрток то причин для их написания может быть множество: - чтобы избежать ошибок при написании кода. Пример - я считаю просто необходимо обернуть сокеты, иначе костей не соберешь - иногда необходимо завернуть сторонню библиотеку чтобы сохранить стилистику собственного кода. Ну уж если принята в коменде практика использовать исключения и RAII ну наверное будет разумным завернуть стороннюю библиотеку. Опять же я не заставляю вас это делать. Мне просто хотелось показать как можно писать с исключениями красиво и понятно. ErV Пример я привел так как меня давно этот вопрос интересовал, и здесь он был "в тему" в том числе как вариант проблемы не обязательно привязанной к DirectX и Win32... Вообще, стандартному C++ , ИМХО, не хватает модели try{...}catch(){..}finally{...}... О вот тут -то выи не правы.finall нуже только при использовании сборщика мусора, если им не пользоваться то можно и без него обойтись.Время жизни объекта в С++ точно определено и освобождение ресурсов совершенно безболезненно можно связать с деструктором, что собстенно у меня и сделано. finally удобно использовать, когда требуется блок, который 100% будет выполнен, как в том случае, когда исключение будет, так и в том, когда его не будет. В случае с использованием try{}catch(){} мне пришлось дублировать блок очистки ресурсов, а это, во-первых, некрасиво, во-вторых, это светит глюками... В случае, если бы был finally, мне этот блок очистки пришлось бы писать только один раз. Причем тут сборщик мусора? Поставить очистку после catch - тоже не вариант, так как внутри catch я вполне могу решить кинуть исключение дальше...[/quot] Я прекрасно знаю как писать с finally ибо последнее время постоянно пишу на Java. И опять повторяю что в C++ нет необходимости в этой конструкции. Более того если она вам понадобилась то скорее всего вы пишите в "неправильном стиле". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2007, 13:15 |
|
||
|
Исключения: за и против
|
|||
|---|---|---|---|
|
#18+
MasterZivТак, кажется с тобой все понятно, ты просто не понимаешь идеологию исключений и как они должны работать. Так вот, с исключениями ты можешь делать ровно то же самое. Единственная проблема в том, что язык С++ не заставляет специфицировать все исключения функции (но тем не менее они могут быть указаны) и ты не видишь иногда, какие исключения тебе надо обрабатывать. Это в общем случае должно быть указано в документации на функцию (но может быть и в коде) и зависит от того, насколько хорошо поставлена технология программирования и документирования в данной конторе, которая разрабатывает код. Но самое главное не в этом, а в том, что при использовании кодов возвратов мы наблюдаем ту же самую проблему - не все коды возвратов могут быть описаны, и ты можешь запросто не знать половины из них и неправильно их обрабатывать. Так что в этом смысле ситуация ну ничем не отличается.Есть отличие! Когда я работаю с кодами возврата, и функция выдала мне что-то неизвестное, я хотя бы всегда знаю какая именно функция сгенерировала этот неизвестный код. С исключениями мне остается только надеяться, что внутри исключения записана информация о том кто это исключение сгенерировал. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. MasterZivСобственно идеология исключений и заключается в том, что функция получает еще один канал общения с окружающим ее миром, помимо возвращаемого значения и входных/выходных параметров. Причем информация, получаемая из функции по этому каналу может быть обработана ГДЕ УГОДНО, а не только в месте вызова этой функции.Вот это самое ГДЕ УГОДНО мне в исключениях не нравится больше всего. Если у меня произошла ошибка, я хочу знать где она произошла. Я хочу видеть обработку ошибки на том же экране текстового редактора что и вызов функции эту ошибку генерирующий. Мне не нравится бегать по тексту вперед-назад и вспоминать "А кто у нас может сгенерировать это исключение? А все ли я исключения перехватил?" MasterZivТы мне примеров языков БЕЗ исключений так и не привел. C, FORTRAN ?Ой, да любой необъектный, и даже некоторые объектные как например VisualBasic и PowerBuilder. Плюс все скриптовые. Может ты их и не считаешь серьезными языками, но тем не менее, люди на них пишут очень много. Тот же shell например. Я знаю например индустриальную систему работающую на нефтеперекачивающих станциях написаную целиком на С и ksh. На С - все расчеты и драйвера датчиков, на ksh - весь операторский гуй, контроль датчиков и вся логика управления насосами. Соглашусь что это достаточно уникальная система, но влится в команду разработчиков и поддерживать ее было очень просто. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2007, 18:22 |
|
||
|
Исключения: за и против
|
|||
|---|---|---|---|
|
#18+
roman10 White OwlЗачем мне исключение сгенерированое драйвером железа если я пишу гуй? Ошибка произошедшая на одном уровне должна быть обработана на этом же уровне или в крайнем случае на следующем уровне. Поднимать ее выше можно, но не правильно.Забавно. Как вы, к примеру обработаете на уровне железа отказ при записи на диск? Или сбой канала связи? Ни как! Единственный способ обработать фатальную ошибку, это передать ее наверх, чтобы приложение могло предупредить пользователя, что что-то пошло не так, и предоставить диагностическую информацию для передаче службе поддержки или записи в лог. Все нефатальные ошибки (т.е. которые можно разрулить без вмешательства пользователя) железом и так обрабатываются.эээээ... юноша, вы что-нибудь писали для железа? Ошибку железа ты никогда не передаешь наверх. Ошибка железа это сбой при записи в конкретный сектор диска, или несовпадение контрольной суммы в пакете и или неверный заголовок, или длина пакета... А наверх всегда уходит одна единственная ошибка: "плохой пакет". Следующий уровень уже решает повторить попытку посылки пакета или сообщить выше о потере связи, что там с пакетом произошло в действительности на уровне гуя совершенно не важно. Гую надо обрабатывать только два типа ошибки - нет ошибки и обрыв связи. Но если ты сильно хочешь - можешь конечно сообщать гую о всех пакетах с неверной контрольной суммой или с потеряным хвостом :) roman10 White OwlА с исключениями мне всегда приходится их обрабатывать или надеятся что кто-то там, вызвавший мою процедуру правильно обработает исключение брошеное функцией.При ручном контроле за возвращаемыми кодами ошибок вам тоже придется их всегда обрабатывать. В случае исключений достаточно один раз написать блок catch(), иногда один на все приложение.ээээээ..... Ну с такими аргументами даже спорить сложно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2007, 18:35 |
|
||
|
Исключения: за и против
|
|||
|---|---|---|---|
|
#18+
MasterZiv> А потому что серьезные проекты на них не пишут. > пишут ещё как! Примеры давай. Проект, язык. Я в общем-то не против т.н. динамических языков, а очень даже за, я хотел отмести языки типа Perl и bash shell script.В Перле кстати, исключения есть. А вот почему они настолько редко используется что про них почти никто не знает - это уже вопрос для размышления на досуге :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2007, 18:42 |
|
||
|
Исключения: за и против
|
|||
|---|---|---|---|
|
#18+
White Owl пишет: > Ой, да любой необъектный, Конкретнее. и даже некоторые объектные как например > VisualBasic и PowerBuilder. В VB на сколько я помню есть исключения. Плюс все скриптовые. Может ты их и не > считаешь серьезными языками, Python - скриптовый язык ? Исключения там есть. Значит - не все скриптовые. Но вот уж что .sh - это язык программирования - это уж увольте. Не согласен я считать его языком программирования. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2007, 19:23 |
|
||
|
Исключения: за и против
|
|||
|---|---|---|---|
|
#18+
White OwlЕсть отличие! Когда я работаю с кодами возврата, и функция выдала мне что-то неизвестное, я хотя бы всегда знаю какая именно функция сгенерировала этот неизвестный код. С исключениями мне остается только надеяться, что внутри исключения записана информация о том кто это исключение сгенерировал. А вот тут вы передергиваете. Сами наверняка писали неоднократно Код: plaintext 1. 2. White Owl Вот это самое ГДЕ УГОДНО мне в исключениях не нравится больше всего. Если у меня произошла ошибка, я хочу знать где она произошла. Я хочу видеть обработку ошибки на том же экране текстового редактора что и вызов функции эту ошибку генерирующий. Мне не нравится бегать по тексту вперед-назад и вспоминать "А кто у нас может сгенерировать это исключение? А все ли я исключения перехватил?" [/qout] Опять заблуждение или обман. Если вы получаете исключение от стороннего вызова то так ли уж интересна его внутренняя кухня и знание что вы получили исключение от метода (функции) с именем XXX. Все равно внутрь кода вы не залезете. А если это ваш код, то кто вам иешает ввести собственнубю политику исключений? Нарисовать собственный базовый класс исключений и впередю Если желаете код пришлю и все будет нормально. [quot White Owl]Ой, да любой необъектный, и даже некоторые объектные как например VisualBasic и PowerBuilder. Плюс все скриптовые. Может ты их и не считаешь серьезными языками, но тем не менее, люди на них пишут очень много. Ну на счет всех необектных языков это вы погорячилисью Исключения совсем не изобретение родоначальников объектного подхода, кажется еще в PL1 были, и в Аде, а вот ребята из форума по Oracle (PL/SQL) без исключений тоже не могут. Кстати в нашем любимом и могучем их тоже поначалу не было, однако включили их в стандарт, а там просто так и мышь не пролезет.. А по хорошему надо уметь писать и так и так... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2007, 19:46 |
|
||
|
Исключения: за и против
|
|||
|---|---|---|---|
|
#18+
MasterZivВ VB на сколько я помню есть исключения.В VB.Net есть. В классическом VB6 уж не говоря о VBA и VBS - нету. А насчет конкретнее... Наверное вынужден согласится, но под давлением моды, сейчас расширения языка добавляющие поддержку исключений делают подо все. Уже вон и Perl и PHP сдались. MasterZivНо вот уж что .sh - это язык программирования - это уж увольте. Не согласен я считать его языком программирования.Программу на нем написать можно? Компьютер эту программу выполнит? Значит язык программирования. blindedА вот тут вы передергиваете. Сами наверняка писали неоднократно Код: plaintext 1. Я пишу обычно так: Код: plaintext 1. 2. 3. 4. blindedОпять заблуждение или обман. Если вы получаете исключение от стороннего вызова то так ли уж интересна его внутренняя кухня и знание что вы получили исключение от метода (функции) с именем XXX. Все равно внутрь кода вы не залезете.Ну как же не интересно. Вот например задача чтения резалтсета. Сделал ты "cout << rs[0] << rs[1] << rs[2]" поймал исключение FieldIsNull или FieldDoesnotExist и скажи мне теперь, какое из полей это исключение кинуло. Да в конце концов, реши задачку отлова незадокументированого исключения, пример я уже показывал. blindedА по хорошему надо уметь писать и так и так...Но вот так мы пишем с легкостью, а вот так - с отвращением :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2007, 20:33 |
|
||
|
Исключения: за и против
|
|||
|---|---|---|---|
|
#18+
White Owl MasterZivВ VB на сколько я помню есть исключения. В VB.Net есть. В классическом VB6 уж не говоря о VBA и VBS - нету. А насчет конкретнее... Наверное вынужден согласится, но под давлением моды, сейчас расширения языка добавляющие поддержку исключений делают подо все. Уже вон и Perl и PHP сдались. Так как на счет PL1 и Аda? А вот на счет Perl'a это да Perl - это вообще не язык, это буйное помешательство вобравшее в себя весь возможный набор парадигм... White Owl MasterZivНо вот уж что .sh - это язык программирования - это уж увольте. Не согласен я считать его языком программирования. Программу на нем написать можно? Компьютер эту программу выполнит? Значит язык программирования. Тут спорить не буду, ничем не хуже чем Basic White Owl blindedА вот тут вы передергиваете. Сами наверняка писали неоднократно Код: plaintext 1. Я пишу обычно так: Код: plaintext 1. 2. 3. 4. Круто, я бы повесился. А чего же префикса имени ошибки не даешь? Каждой функции свой префикс ошибки!!! White Owl blindedОпять заблуждение или обман. Если вы получаете исключение от стороннего вызова то так ли уж интересна его внутренняя кухня и знание что вы получили исключение от метода (функции) с именем XXX. Все равно внутрь кода вы не залезете. Ну как же не интересно. Вот например задача чтения резалтсета. Сделал ты "cout << rs[0] << rs[1] << rs[2]" поймал исключение FieldIsNull или FieldDoesnotExist и скажи мне теперь, какое из полей это исключение кинуло. Да в конце концов, реши задачку отлова незадокументированого исключения, пример я уже показывал. Ну в данном конкретном примере - элементарно cout<< rs[0] << flush < << rs[1] << flush << rs[2] << endl; Кстати а чем бы тебе помог код возврата? Я правда не спец в ADO или что оно там, вот только сомневаюсь, что ежели спросить у Exception what оно не скажет ничего о поле в котором произошла ошибка:) White Owl blindedА по хорошему надо уметь писать и так и так...Но вот так мы пишем с легкостью, а вот так - с отвращением :) Взаимно, вот только полюса поменяйте ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2007, 21:05 |
|
||
|
Исключения: за и против
|
|||
|---|---|---|---|
|
#18+
blinded Код: plaintext 1. 2. 3. 4. Круто, я бы повесился. А чего же префикса имени ошибки не даешь? Каждой функции свой префикс ошибки!!! [/quot] Для таких случаев в C++ есть отличная возможость все коды ошибок запихнуть в enum который можно засунуть в namespace или даже класс. И никаких префиксов по пять раз не понадобиться писать. Вообще рекомендую вам посмотреть исходники Qt как образец... Вы вот про обертки для интерфейсов писали. А что мешает вам нужные наборы функций обьединить в пространства имен или классы, в рамках которых (в области видимости) объявить коды ошибок? Обалденно от name clash'ей помогает.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2007, 22:31 |
|
||
|
Исключения: за и против
|
|||
|---|---|---|---|
|
#18+
blindedТак как на счет PL1 и Аda?Я по ним только учебники в детстве читал, а практически ничего не писал. Так что ничего конкретного насчет них сказать не смогу, извините. blindedА вот на счет Perl'a это да Perl - это вообще не язык, это буйное помешательство вобравшее в себя весь возможный набор парадигм...Ну не надо. Perl это жемчужина со всех точек зрения. Обожаю Perl. Жаль что он мне сейчас по работе почти не нужен. blinded White OwlУ каждой функции, на каждом слое свой собственный набор ошибок. Ошибка нижнего слоя наверх никогда не уходит. Вообще.Круто, я бы повесился. А чего же префикса имени ошибки не даешь? Каждой функции свой префикс ошибки!!!И префиксы даю и enum из функции возвращаю. Очень удобно получается. Смотришь исходник и с первого взгляда видно ошибки какой группы мы здесь обрабатываем. Кстати, в java еще на уровне компиляции есть замечательная штука - контроль за тем, чтобы все исключения брошеные вызваной функцией были хоть как-то обработаными. А в С++ такого контроля нету... Зато если функция возвращает enum, то вот например такой код: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Код: plaintext 1. А представь что мы вызываем foo() из какой-нибудь чужой библиотеки, а потом однажды обновили эту самую чужую библиотеку и теперь foo() новой версии выдает больше (или вообще другие) ошибки чем в предыдущей версии. В варинте с enum в качестве кода возврата компилятор мне сразу накидает варнингов про все места где я использовал эту функцию, но не обновил работу с ней. Попробуй повторить это с исключениями. blindedНу в данном конкретном примере - элементарно cout<< rs[0] << flush < << rs[1] << flush << rs[2] << endl; Кстати а чем бы тебе помог код возврата? Я правда не спец в ADO или что оно там, вот только сомневаюсь, что ежели спросить у Exception what оно не скажет ничего о поле в котором произошла ошибка:)Ну ADO здесь ни при чем, это абстрактный резалтсет :) Читай топик, я там выше уже пытался объяснить как я предпочитаю делать оператор [] для резалтсетов. Но все таки, может мне кто-нибудь элегантно решить задачку перехвата недокументированых исключений? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2007, 23:04 |
|
||
|
Исключения: за и против
|
|||
|---|---|---|---|
|
#18+
ErV blinded WhiteOwl Код: plaintext 1. 2. 3. 4. Круто, я бы повесился. А чего же префикса имени ошибки не даешь? Каждой функции свой префикс ошибки!!! Для таких случаев в C++ есть отличная возможость все коды ошибок запихнуть в enum который можно засунуть в namespace или даже класс. И никаких префиксов по пять раз не понадобиться писать. Вообще рекомендую вам посмотреть исходники Qt как образец... Сознаюсь до этого не дошел, видимо потому что начал пользовать исключения... А QT , что QT? мне Java Swing нравится ErV Вы вот про обертки для интерфейсов писали. А что мешает вам нужные наборы функций обьединить в пространства имен или классы, в рамках которых (в области видимости) объявить коды ошибок? Обалденно от name clash'ей помогает.. Ну на вкус и цвет советчиков нет. Один любит арбуз, другой свиной хрящик. А посему мне классы ближе наборов функций. Видимо мы разные парадигмы предпочитаем ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2007, 10:54 |
|
||
|
Исключения: за и против
|
|||
|---|---|---|---|
|
#18+
blindedА QT , что QT? мне Java Swing нравится В исходниках синтаксис/стиль написания удачный. Имхо. Вот и все. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2007, 11:41 |
|
||
|
Исключения: за и против
|
|||
|---|---|---|---|
|
#18+
White Owl пишет: > И префиксы даю и enum из функции возвращаю. Очень удобно получается. > Смотришь исходник и с первого взгляда видно ошибки какой группы мы здесь > обрабатываем. Программисты делятся на две категории. Одни еще думают, что все ошибки в программе можно контролировать, другие уже понимают, что это невозможно. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2007, 12:35 |
|
||
|
Исключения: за и против
|
|||
|---|---|---|---|
|
#18+
ErV blindedА QT , что QT? мне Java Swing нравится В исходниках синтаксис/стиль написания удачный. Имхо. Вот и все. Не нравится препроцесоор, ненавижу! Только не надо агитировать или объяснять про препроцессор С. Сам писал кучу всего и на С, и на m4, и на embeded SQL и на idl. После всего осталось твердое убеждение что хороша та библиотека (пакет) которая использует только средства языка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2007, 13:24 |
|
||
|
Исключения: за и против
|
|||
|---|---|---|---|
|
#18+
[quot White Owl blindedА вот на счет Perl'a это да Perl - это вообще не язык, это буйное помешательство вобравшее в себя весь возможный набор парадигм...Ну не надо. Perl это жемчужина со всех точек зрения. Обожаю Perl. Жаль что он мне сейчас по работе почти не нужен. [/quot] Какие мы однако разные. Но это в соседний форум. White Owl Кстати, в java еще на уровне компиляции есть замечательная штука - контроль за тем, чтобы все исключения брошеные вызваной функцией были хоть как-то обработаными. А в С++ такого контроля нету... Ну строгость законов смягчается необязательностью их исполененя. Запросто можно кинуть исключение не указав его в сигнатуре. Ну есть еще мерзкие исключения, которые вылазят наружу из самой java машины. Схватить NullPointerException или ClassNotFoundException святое дело. Ну и довольно забавно выглядит сигнатура метода у которого целый шлейф возможных исключений. Обычно после3-4 возможных исключений приходится рисовать свое собственное инкапсулирующее то, что могут сгенерировать использованные в методе вызовы.. White Owl Зато если функция возвращает enum, то вот например такой код: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Код: plaintext 1. Здорово. Вы случаем не МехМат заканчивали? White Owl А представь что мы вызываем foo() из какой-нибудь чужой библиотеки, а потом однажды обновили эту самую чужую библиотеку и теперь foo() новой версии выдает больше (или вообще другие) ошибки чем в предыдущей версии. В варинте с enum в качестве кода возврата компилятор мне сразу накидает варнингов про все места где я использовал эту функцию, но не обновил работу с ней. Попробуй повторить это с исключениями. И не подумаю. У меня полнаяя сборка идет на Sun'e часа полтора (без тестов), потом еще неделю логи разбирать? Не могу себе позволить сие удовольствие. White Owl blindedНу в данном конкретном примере - элементарно cout<< rs[0] << flush < << rs[1] << flush << rs[2] << endl; Кстати а чем бы тебе помог код возврата? Я правда не спец в ADO или что оно там, вот только сомневаюсь, что ежели спросить у Exception what оно не скажет ничего о поле в котором произошла ошибка:)Ну ADO здесь ни при чем, это абстрактный резалтсет :) Читай топик, я там выше уже пытался объяснить как я предпочитаю делать оператор [] для резалтсетов. Прочитал и считаю что вы не правы. Null значение надо уметь выводить, а вот несуществующее поле - это извините меня - ошибка программы, несоблюдение контракта. И в такой ситуации надо аварийно завершаться. Ибо пользователь не советчик. White Owl Но все таки, может мне кто-нибудь элегантно решить задачку перехвата недокументированых исключений? Ну это примерно тоже что и поиск незадукоментированного кода возврата. В общем случае не решаемо, при наличии отладочной информации в модуле - с помощью отдачика ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2007, 15:56 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=34381604&tid=2029270]: |
0ms |
get settings: |
5ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
149ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
| others: | 214ms |
| total: | 446ms |

| 0 / 0 |
