metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2008-10-17 11:34 pm

Об исключениях

Windows Imaging Component от разработчика Микрософт.

Все более-менее понятно, кроме двух вещей:
1) Почему обязательно COM, а не flat API с хендлами?
2) Почему нельзя использовать исключения?

Фиг с ним с COM, это какая-то странная микрософтовская религия, но вот про исключения я не понимаю. Такое ощущение, что в С/С++ какие-то есть тонкости с исключениями, которых я не знаю и которые мешают их использовать.

По-моему, в начале метода гораздо проще выполнить проверки и кинуть исключение, которое обработается там, где юзер нашего API знает, что с ним делать, или показать пользователю сообщение об ошибке, которое будет показано тому, кто знает что с ним делать, чем проверять на каждом уровне вызовов коды возврата ВСЕХ вызовов, которые могут вернуть ошибку.
Причем try finally, по-моему, более простой вариант очистки выделенных ресурсов, чем куча goto и проверок.

UPD: Насчет исключений разъяснили. В c++ try/finally конструкция нестандартная, а вместо нее используется RAII (который еще и менее многословен, вообще-то).

(Anonymous) 2008-10-17 08:50 pm (UTC)(link)
у гугла тоже такая же ботва

[identity profile] jek-hor.livejournal.com 2008-10-17 09:05 pm (UTC)(link)
Погоди, а как с помощью исключений обрабатывается случай с ошибкой в середине последовательных выделений ресурсов?

[identity profile] kkirsanov.livejournal.com 2008-10-17 09:15 pm (UTC)(link)

[identity profile] max-posedon.livejournal.com 2008-10-17 10:03 pm (UTC)(link)
Потому что исключения и COM несовместимы.

Вот допустим по поводу полнолуния, захотел повызывать COM-вызовы из... Xslt преобразований, как мне там исключения обрабатывать?...

[identity profile] ykaliuta.livejournal.com 2008-10-17 11:25 pm (UTC)(link)
куча goto и есть исключения руками (а что за куча проверок?), если мы об одном и том же. Но обычно не куча а 3-5.

[identity profile] rezkiy.livejournal.com 2008-10-18 01:18 am (UTC)(link)
расскажите мне как без СОМ или чего-то ему подобного делать аналог аут-оф-прок комобъектов?

[identity profile] 1ceheart.livejournal.com 2008-10-18 09:56 am (UTC)(link)
Мне тут недавно один разработчик доказывал, что в драйвере можно использовать try/catch (и finally, разумеется), с пеной у рта практически. Аргументация была железная - "ну я же пишу драйвер на C++! А в C++ есть исключения! Значит, должны быть исключения!".

Ситуация не та, конечно, но если есть возможность не использовать C++ exceptions, их не надо использовать. Имхо.

А COM, я думаю, потому что threading model и маршалинг сразу автоматически, это удобно.

[identity profile] volodymir-k.livejournal.com 2008-10-19 03:58 pm (UTC)(link)
COM это апи на уровне "из эксель бейсика вызывать", а не на уровне "красноглазый фрик борется с компиляторами." Ком это прогресс и цивилизация.

[identity profile] zamotivator.livejournal.com 2008-11-21 10:17 am (UTC)(link)
RAII предоставляет _уникальные_ средства для разработки.
Без дураков - я такого больше не видел ни в одном языке программирования.
Суть его очень проста и банальна - на _стеке_ создается некоторый объект, в конструкторе которого производиться захват ресурса, а в деструкторе - освобождение.
Например,

{
boost::scoped_lock lock( some_mutex ); // захватили мьютекс. В деструкторе освободим. Где бы ниже исключение не вылетело - он не останется висящим
std::shared_array< char > text( new char[ 100 ] ); // аналогично
//...

На основе этого построен паттерн "Транзакция"
http://insidecpp.ru/patterns/transaction/

[identity profile] sarent.livejournal.com 2008-12-13 08:30 am (UTC)(link)
Говоришь, еще и полнолуние на носу?..
У меня вот тоже крыша едет от этого всего. Встаешь, темным-темно за окном, домой приходишь, темно, на улице травка зеленая и вечный туман. Гадость... (http://www.spacedev.ru)

[identity profile] stra-taktik.livejournal.com 2008-12-14 11:55 am (UTC)(link)
Многим в полнолуние не спится... (http://www.insurance-lifes.ru)

[identity profile] magdiya.livejournal.com 2008-12-15 01:53 pm (UTC)(link)
Полнолуние-полнолуние, куда не плюнь. Да успокойтесь уже, других тем нет что ли... (http://www.upbuilding.ru)