Login
C++ exceptions: за и против
26.06.07 15:56
Читаю тут: http://www.wikiservice.at/dse/wiki.cgi?ExceptionsConsideredHarmful, но пока не дочитал до конца.
Шеф против исключений, а я - за, ну и понятно, чья в итоге возьмет. Как бы мне его переубедить?.. Или переубедите меня, в конце концов.
Шеф против исключений, а я - за, ну и понятно, чья в итоге возьмет. Как бы мне его переубедить?.. Или переубедите меня, в конце концов.
NEW 26.06.07 16:35
in Antwort Simple 26.06.07 15:56
А что использовать вместо исключений ? goto обработчик ошибок ?
Ну и конечно исключения втыкать везде тоже не надо .
Ну и конечно исключения втыкать везде тоже не надо .
NEW 26.06.07 16:54
in Antwort Simple 26.06.07 15:56
Определенно надо его переубеждать. Иначе начнет программа у клиента выпадать, выдавая только разработчику ОС понятное сообщения. Они ему жалится начнут, а он тебя кушать. Где-то на заре .NET у М$ была статья для переходящих с VB на VB.NET, в чем преимущества обработки Exception, там достаточно хорошо аргументировалось. А может это где в другом месте было. Дома поискаю. 

NEW 26.06.07 18:44
in Antwort Simple 26.06.07 15:56
Есть в Exceptions оверхед, но он не слишком большой. Разумеется, если не вотнут тру-катцх куда-нибудь в тяжелый цикл.
Так что - юзабилитно.
У нас было даже спец.требование - тру-катчить использование каждого внешнего (из внешней ДЛЛки) объекта и тру-катчить полностью содержимое конструктора. Остальное - по мере необходимости.
Так что - юзабилитно.
У нас было даже спец.требование - тру-катчить использование каждого внешнего (из внешней ДЛЛки) объекта и тру-катчить полностью содержимое конструктора. Остальное - по мере необходимости.

NEW 26.06.07 18:53
in Antwort toptop 26.06.07 16:54
Наша система уже давно на рынке и стабильна. Дело не в этом. Я хочу их использовать, а они даже не включены. Если же их просто так включить, то возможны осложнения, или нет?
NEW 26.06.07 18:58
in Antwort Simple 26.06.07 18:53
то возможны осложнения, или нет?
------
Не замечал осложнений. Правда и "отключать" приходилось только в дебагере.
Если исключение выброшено - оно будет обработано. Вопрос только где и кем. Нормально - если тобою в коде кэтча, ненормально - если всплывет до уровня пользователя.
------
Не замечал осложнений. Правда и "отключать" приходилось только в дебагере.
Если исключение выброшено - оно будет обработано. Вопрос только где и кем. Нормально - если тобою в коде кэтча, ненормально - если всплывет до уровня пользователя.
NEW 26.06.07 19:03
in Antwort Murr 26.06.07 18:58
Я имел в виду опцию компилятора. Если она не выставлена, никаких исключений ваще нет.
NEW 26.06.07 19:49
in Antwort Simple 26.06.07 19:03
На мой взгляд - бессмыссленно отключать.
Бо, если исключение возникает - оно все одно возникает. А тру-кэтч - только инструмент его обработки.
Кроме этого - программист, использующий Ексептионы, мыслит несколько иначе, чем такой же бедолага,
неимеющий возможности для этого. К примеру, твои ретурн-коде использоваться не будут, а будет полное
текстовое сообщение об месте и причине ошибки, обрабатываемое не в функции вызова, а там где оно
будет получено/откэчено.
Т.е. если не используется - будет один код, если используется - другой. И этот другой код написан и работает
по-другому. Так что если используется и выключено - становится непонятно кто и как должен обрабатывать
возникающие ошибки.
Еще существенный момент - ошибки, возникающие в конструкторах - отследить их по ретурн-коде просто
невозможно.
Ну и писать в старом стиле, при использовании Ехсепртион, станет неудобно в самом ближайшем будущем.
Представь себе, что есть иерархия классов - десяток уровней, 10-12 тыс классов - каким образом пасовать
ретурн-коде и разбираться с ними? Так что альтернативы то и нет - надо юзать и на полную...
Бо, если исключение возникает - оно все одно возникает. А тру-кэтч - только инструмент его обработки.
Кроме этого - программист, использующий Ексептионы, мыслит несколько иначе, чем такой же бедолага,
неимеющий возможности для этого. К примеру, твои ретурн-коде использоваться не будут, а будет полное
текстовое сообщение об месте и причине ошибки, обрабатываемое не в функции вызова, а там где оно
будет получено/откэчено.
Т.е. если не используется - будет один код, если используется - другой. И этот другой код написан и работает
по-другому. Так что если используется и выключено - становится непонятно кто и как должен обрабатывать
возникающие ошибки.
Еще существенный момент - ошибки, возникающие в конструкторах - отследить их по ретурн-коде просто
невозможно.
Ну и писать в старом стиле, при использовании Ехсепртион, станет неудобно в самом ближайшем будущем.
Представь себе, что есть иерархия классов - десяток уровней, 10-12 тыс классов - каким образом пасовать
ретурн-коде и разбираться с ними? Так что альтернативы то и нет - надо юзать и на полную...
NEW 26.06.07 20:00
in Antwort Murr 26.06.07 19:49
Ты как будто только себя читаешь. Исключения не используются и отключены - это факт.
NEW 26.06.07 20:06
in Antwort Simple 26.06.07 20:00
C++ exceptions: за и против vs Исключения не используются и отключены - это факт.
------
Ты уж определись со своей ситуацией...
------
Ты уж определись со своей ситуацией...
NEW 26.06.07 20:24
К сожалению не всегда применимо .
Пишу в данный момент софтину , работаю с УСБ картой , меряю напряжение на нескольких каналах.
В функции создается task , channels , sample clock и т.д. в общем
резервирую рессурсы и потом всё это дело читается и посылается сигналом (кстати бустовским ;-))
Сишные функции сам завёртывал в классы , при ошибках запускаю исключения.
Если бы писал без исключений , пришлось бы проверять каждое возвращённое значение и вызывать функцию зачистки или
прыгать на метку и зачищать ,не важно , на что был бы похож код ?
А так всё акуратно - try catch - рессурсы освободили .
in Antwort Simple 26.06.07 18:52
В ответ на:
return codes.
return codes.
К сожалению не всегда применимо .
Пишу в данный момент софтину , работаю с УСБ картой , меряю напряжение на нескольких каналах.
В функции создается task , channels , sample clock и т.д. в общем
резервирую рессурсы и потом всё это дело читается и посылается сигналом (кстати бустовским ;-))
Сишные функции сам завёртывал в классы , при ошибках запускаю исключения.
Если бы писал без исключений , пришлось бы проверять каждое возвращённое значение и вызывать функцию зачистки или
прыгать на метку и зачищать ,не важно , на что был бы похож код ?
А так всё акуратно - try catch - рессурсы освободили .
NEW 26.06.07 20:58
in Antwort Chipolino 26.06.07 20:24
Ну а как же голый С работает? :)
У меня примерно такая же ситуация, и указание не использовать исключения слегка напрягает.
У меня примерно такая же ситуация, и указание не использовать исключения слегка напрягает.
NEW 26.06.07 21:00
in Antwort Murr 26.06.07 20:06
Исключения не используются и отключены - это факт. Я бы хотел их использовать в дальнейшем, но установки проекта делают это невозможным. Чтобы изменить установки проекта, нужно переубедить шефа. Что тут непонятного?
NEW 26.06.07 21:07
in Antwort Simple 26.06.07 21:00
Чтобы изменить установки проекта, нужно переубедить шефа.
------
Тебе и дан набор аргументов. И За, и Против. Со стороны разработчика. Что тут непонятного?
Могу дать набор аргументов Шефа, имеющего работающий проект. Тоже - и За, и Против.
Но, работая в С++ и имея возможность пользоваться исключениями - не пользоваться ими - глупо.
------
Тебе и дан набор аргументов. И За, и Против. Со стороны разработчика. Что тут непонятного?
Могу дать набор аргументов Шефа, имеющего работающий проект. Тоже - и За, и Против.

Но, работая в С++ и имея возможность пользоваться исключениями - не пользоваться ими - глупо.
NEW 26.06.07 21:10
in Antwort Murr 26.06.07 21:07
У него главный аргумент: new при включенных исключениях швыряет bad_alloc, при выключенных - возвращает NULL. И что я ему на это скажу?
NEW 26.06.07 21:14
in Antwort Simple 26.06.07 20:58
NEW 26.06.07 21:40
in Antwort Simple 26.06.07 21:10
У него главный аргумент: new при включенных исключениях швыряет bad_alloc, при выключенных - возвращает NULL.
И что я ему на это скажу?
------
Что будет делать твой шеф, если потребуется локализовать место возникновения bad_alloc в иерархии? 10-12 уровней?
У меня было 6 уровней, часть из них - в сторонней ДЛЛ, и я в них полностью зашивался из-за невозможности определить
место возникновения проблемы...
Ты выше читал или просматривал? Там четко сказано, что одно из спец.требований - тру-кэтч на весь конструктор. Как раз для таких случаев.
Кроме этого, когда придет
scorpi_, он объяснит (мне лень) как перегрузить new, чтобы не было внешних исключений. Хотя, насколько Я помню, он уже это делал... 
И что я ему на это скажу?
------
Что будет делать твой шеф, если потребуется локализовать место возникновения bad_alloc в иерархии? 10-12 уровней?
У меня было 6 уровней, часть из них - в сторонней ДЛЛ, и я в них полностью зашивался из-за невозможности определить
место возникновения проблемы...
Ты выше читал или просматривал? Там четко сказано, что одно из спец.требований - тру-кэтч на весь конструктор. Как раз для таких случаев.
Кроме этого, когда придет


NEW 26.06.07 21:43
in Antwort Murr 26.06.07 21:40, Zuletzt geändert 26.06.07 21:45 (Simple)
Зачем его локализовывать? Указатель проверяется на месте на ноль, и все дела.
Как перегрузить new, я и сам знаю/найду.
зы Где-то читал, что не рекомендуется швырять через границы dll, а уж перехватывать исключения в самом конструкторе ваще смысла нет.
Как перегрузить new, я и сам знаю/найду.
зы Где-то читал, что не рекомендуется швырять через границы dll, а уж перехватывать исключения в самом конструкторе ваще смысла нет.
NEW 26.06.07 22:09
in Antwort Simple 26.06.07 21:43
Зачем его локализовывать?
-----
Затем, что возникновение ошибки есть ситуация не нормальная - подлежит исследованию на предмет причины возникновения и доработке на предмет устранения - что затруднительно, не зная где оно возникло...
Указатель проверяется на месте на ноль
-----
Ексептион кэтчится на заданном уровне, устраняется причина, при возможности - пересоздается объект и все продолжает работать как если бы ситуации не возникало... и это - без всяких глупостей с проверками на ноль...
зы Где-то читал, что не рекомендуется швырять через границы dll,
-----
Не скажу за все - возможно, что где-то, например, когда длл-ка "исполняется" как отдельная задача, есть смысл для такого ограничения.
У меня, однако, гораздо чаще ситуация, когда расширяется объект из длл-ки - так что без этого - никак.
а уж перехватывать исключения в самом конструкторе ваще смысла нет.
------
Да ну? Я вот как-то привык к тому, что выбрасываемое исключение, если уж оно выпало, т.е. не обработано/разрезолвлено, из конструктора, содержит не "смещение в коде относительно соответствующего сегмента", а нормальное описание проблемы - в конструкторе класса такого-то, невозможно создать агрегированный объект такой-то, по причине... дальше идет описание проблемы возникшей в конструкторе или методе агрегированного объекта... и т.п. Чем более полная и точная информация получается - тем проще понять что именно не так и устранить причину проблемы.
-----
Затем, что возникновение ошибки есть ситуация не нормальная - подлежит исследованию на предмет причины возникновения и доработке на предмет устранения - что затруднительно, не зная где оно возникло...
Указатель проверяется на месте на ноль
-----
Ексептион кэтчится на заданном уровне, устраняется причина, при возможности - пересоздается объект и все продолжает работать как если бы ситуации не возникало... и это - без всяких глупостей с проверками на ноль...
зы Где-то читал, что не рекомендуется швырять через границы dll,
-----
Не скажу за все - возможно, что где-то, например, когда длл-ка "исполняется" как отдельная задача, есть смысл для такого ограничения.
У меня, однако, гораздо чаще ситуация, когда расширяется объект из длл-ки - так что без этого - никак.
а уж перехватывать исключения в самом конструкторе ваще смысла нет.
------
Да ну? Я вот как-то привык к тому, что выбрасываемое исключение, если уж оно выпало, т.е. не обработано/разрезолвлено, из конструктора, содержит не "смещение в коде относительно соответствующего сегмента", а нормальное описание проблемы - в конструкторе класса такого-то, невозможно создать агрегированный объект такой-то, по причине... дальше идет описание проблемы возникшей в конструкторе или методе агрегированного объекта... и т.п. Чем более полная и точная информация получается - тем проще понять что именно не так и устранить причину проблемы.
NEW 26.06.07 22:24
Конкретно в этом случае как ты собрался исследовать причину?
Угу, а для этого переписывается огромное кол-во продуктивного кода, для чего нанимается еще столько же людей, сколько уже работают...
Это да.
Опять тебя заносит... Важно, что объект не будет создан, если исключение бросается из к-ра, а в твоем случае он создан будет, и это неправильно.
in Antwort Murr 26.06.07 22:09
В ответ на:
Затем, что возникновение ошибки есть ситуация не нормальная - подлежит исследованию на предмет причины возникновения и доработке на предмет устранения - что затруднительно, не зная где оно возникло...
Затем, что возникновение ошибки есть ситуация не нормальная - подлежит исследованию на предмет причины возникновения и доработке на предмет устранения - что затруднительно, не зная где оно возникло...
Конкретно в этом случае как ты собрался исследовать причину?
В ответ на:
Ексептион кэтчится на заданном уровне, устраняется причина, при возможности - пересоздается объект и все продолжает работать как если бы ситуации не возникало... и это - без всяких глупостей с проверками на ноль...
Ексептион кэтчится на заданном уровне, устраняется причина, при возможности - пересоздается объект и все продолжает работать как если бы ситуации не возникало... и это - без всяких глупостей с проверками на ноль...
Угу, а для этого переписывается огромное кол-во продуктивного кода, для чего нанимается еще столько же людей, сколько уже работают...
В ответ на:
Не скажу за все - возможно, что где-то, например, когда длл-ка "исполняется" как отдельная задача, есть смысл для такого ограничения.
У меня, однако, гораздо чаще ситуация, когда расширяется объект из длл-ки - так что без этого - никак.
Не скажу за все - возможно, что где-то, например, когда длл-ка "исполняется" как отдельная задача, есть смысл для такого ограничения.
У меня, однако, гораздо чаще ситуация, когда расширяется объект из длл-ки - так что без этого - никак.
Это да.
В ответ на:
Да ну? Я вот как-то привык к тому, что выбрасываемое исключение, если уж оно выпало, т.е. не обработано/разрезолвлено, из конструктора, содержит не "смещение в коде относительно соответствующего сегмента", а нормальное описание проблемы - в конструкторе класса такого-то, невозможно создать агрегированный объект такой-то, по причине... дальше идет описание проблемы возникшей в конструкторе или методе агрегированного объекта... и т.п. Чем более полная и точная информация получается - тем проще понять что именно не так и устранить причину проблемы.
Да ну? Я вот как-то привык к тому, что выбрасываемое исключение, если уж оно выпало, т.е. не обработано/разрезолвлено, из конструктора, содержит не "смещение в коде относительно соответствующего сегмента", а нормальное описание проблемы - в конструкторе класса такого-то, невозможно создать агрегированный объект такой-то, по причине... дальше идет описание проблемы возникшей в конструкторе или методе агрегированного объекта... и т.п. Чем более полная и точная информация получается - тем проще понять что именно не так и устранить причину проблемы.
Опять тебя заносит... Важно, что объект не будет создан, если исключение бросается из к-ра, а в твоем случае он создан будет, и это неправильно.
No,
look. I do mind. The Dude minds. This will not stand, ya know, this will not stand, man. (c)
Все о бильярде

NEW 26.06.07 22:54
in Antwort Simple 26.06.07 22:24
Конкретно в этом случае как ты собрался исследовать причину?
------
??? - bad_alloc? У тебя только простые объекты? Или все же что-то достаточно сложное?
Если у тебя вся проблема только в одном вызове - malloc/calloc - перегрузи new и забудь об ней.
Вот когда ты перестанешь понимать, в каком конкретно месте получается нехватка памяти -
тогда вернешься к Исключениям и их причинам.
для этого переписывается огромное кол-во продуктивного кода
------
Разумеется. Только это - аргумент Шефа. Мало того, придется нанимать не в двое, а, примерно, в трое (цифра - пока без объяснений) больше людей.
Важно, что объект не будет создан, если исключение бросается из к-ра, а в твоем случае он создан будет, и это неправильно.
------
Ты опять - читаешь или где? Прямо же написано - пойман Эксептион и устранена, если она может быть устранена, причина, затем объект пересоздан. Если причина не может быть устранена - в новом Эксептионе дается детальное описание проблемы, а объект, как ему и положено, не создается. Кроме этого - при необходимости - нормально, т.е. вызовом деструкторов, прибиваются все созданные агрегированные и связанные, например - в других процессах, объекты, к которым просто невозможно, хранится - хандле, другим способом добраться.
------
??? - bad_alloc? У тебя только простые объекты? Или все же что-то достаточно сложное?
Если у тебя вся проблема только в одном вызове - malloc/calloc - перегрузи new и забудь об ней.
Вот когда ты перестанешь понимать, в каком конкретно месте получается нехватка памяти -
тогда вернешься к Исключениям и их причинам.
для этого переписывается огромное кол-во продуктивного кода
------
Разумеется. Только это - аргумент Шефа. Мало того, придется нанимать не в двое, а, примерно, в трое (цифра - пока без объяснений) больше людей.
Важно, что объект не будет создан, если исключение бросается из к-ра, а в твоем случае он создан будет, и это неправильно.
------
Ты опять - читаешь или где? Прямо же написано - пойман Эксептион и устранена, если она может быть устранена, причина, затем объект пересоздан. Если причина не может быть устранена - в новом Эксептионе дается детальное описание проблемы, а объект, как ему и положено, не создается. Кроме этого - при необходимости - нормально, т.е. вызовом деструкторов, прибиваются все созданные агрегированные и связанные, например - в других процессах, объекты, к которым просто невозможно, хранится - хандле, другим способом добраться.
26.06.07 23:32
Естественно. Как и то, что никто этого делать не будет, вот и вся любовь :)
in Antwort Murr 26.06.07 22:54
В ответ на:
Разумеется. Только это - аргумент Шефа.
Разумеется. Только это - аргумент Шефа.
Естественно. Как и то, что никто этого делать не будет, вот и вся любовь :)
NEW 27.06.07 01:52
in Antwort Simple 26.06.07 23:32
никто этого делать не будет
-----
Значит у работничков будет в три раза больше работы. Только и делов-то...
-----
Значит у работничков будет в три раза больше работы. Только и делов-то...

NEW 27.06.07 17:39
in Antwort Simple 27.06.07 09:34
Нее, батенька, дануегонах...
Бо, я только что спрыгнул с точно такого же проекта... Довел до релиза и ушел.
Шеф, изначально, выделил _три_ дня на переход. Я сказал, что невозможно.
После этого лимит был увеличен до... 10 рабочих дней. Т.е. до двух недель
при 10 рабочих часах в день... Я не стал спорить - срок все одно не реальный -
но сказал коллегам, что что-то реальное может быть на выходе через, примерно,
три месяца. Реально до релиза прошло почти 4 месяца...
Бо, я только что спрыгнул с точно такого же проекта... Довел до релиза и ушел.
Шеф, изначально, выделил _три_ дня на переход. Я сказал, что невозможно.
После этого лимит был увеличен до... 10 рабочих дней. Т.е. до двух недель
при 10 рабочих часах в день... Я не стал спорить - срок все одно не реальный -
но сказал коллегам, что что-то реальное может быть на выходе через, примерно,
три месяца. Реально до релиза прошло почти 4 месяца...
NEW 30.06.07 01:05
in Antwort Simple 26.06.07 15:56
>Шеф против исключений
Это ключевая фраза.
. Исключения не нужны 
Немецкого шефа переубеждать смысла нет, проверено на собственном опыте.
Это ключевая фраза.


Немецкого шефа переубеждать смысла нет, проверено на собственном опыте.
