вторник, 14 апреля 2009 г.

Мы в Microsoft всегда считаем, что стандарт можно улучшить.

Цитата, вынесенная в заголовок, уже стала крылатой (вот источник: "Основы COM" Дейл Роджерсон). И правда, могут...

Visual C++ departs from the ANSI Standard in its implementation of exception specifications. The following table summarizes the Visual C++ implementation of exception specifications:
...

throw(type): The function can throw an exception of type type. However, in Visual C++ .., this is interpreted as throw(...). (MSDN)

10 комментариев:

Анонимный комментирует...

О да, заманали они со своим отношением к стандартам.

Left комментирует...

Было бы о чём жалеть.
Использовать спецификацию исключений в С++ - себе дороже.

Анонимный комментирует...

не такое уж это и горе - throw(type), работающее по стандарту, чуть ли не хуже, чем если писать вообще без throw спецификации

и потому многие (даже Страуструп) рекомендуют статическую проверку спецификации сторонними инстументами

в студии Team Edition такой инструмент, насколько помню, есть

Unknown комментирует...

Left, имеются конкретные факты или это субъективный личный опыт?

Unknown комментирует...

alek86, сдается мне что Вы перевираете старика Страуструпа.

Left комментирует...

Ну, во-1 это говорит главный С++-гуру современности - Herb Sutter ;)

А во-2 - реально даже в Java где checked exceptions сделаны правильно (т.е. проверяются в compile-time, а не в runtime) - эти самые checked exceptions очень быстро становятся Pain-In-Ass. Слишком быстро наталкиваешься на то что прописывая спецификацию исключений у предка ты накладываешь очень серьёзные ограничения на имплементацию потомка. Да и потом, держать в уме не только иерархию классов модели данных но ещё и иерархию классов исключений - непозволительная роскошь ;) Ну и реально при правильном exception-safe кодирование (которое есть гуд и к которому нужно стремиться всегда) конкретному коду должно быть плевать на тип исключения ;)

Unknown комментирует...

Left, пруфлинк на Herb Sutter'а в студию.

Ну а то что во вторых, ссылкой на Java меня не напугать, сам там был. Видимо у вас случай такой был особеннный, кривой by design.

Использовать исключения или нет - действительно особый разговор, и к чему стоит стремиться - каждый определяет сам для себя. Или за него определяют соглашения по кодированию в конкретном проекте ;).

Left комментирует...

http://www.gotw.ca/publications/mill22.htm

Left комментирует...

Использовать исключения безусловно нужно.
Использовать checked exception не нужно, даже если они поддерживаются языком корректно.
А вот выбор между тем что является а что не является исключительной ситуацией - вот это уже далеко не так тривиально.
Для примера - есть функция чтения из файла. Так вот, если на диске попадается bad-block - то каждый вменяемый программист бросит exception и будет прав - ситуация действительно исключительная, происходит 1 раз на многие миллионы вызовов. Каждый, кроме одного - того кто пишет утилиту которая читает данные с повреждённых дисков. Для него эта ситуация вовсе не исключительная а вполне себе штатная. Если он будет каждый раз ловить исключения то это во-1 размажет логику во-2 просадит производительность. Так что этому программисту обычный интерфейс функции чтения из файла уже будет неприемлим. Ему нужно что-то более универсальное и одновременно менее удобное в повседневном использовании. Вот это и есть вопрос выбора бросать исключения или нет (пример я наверное привёл слегка надуманный, но думаю из него ясно о чём это я).

Unknown комментирует...

Left, большое спасибо и за ссылку, и за комментарии. Пожалуй, постараюсь подготовить расширенную статью про исключения :).