Об исключениях
Windows Imaging Component от разработчика Микрософт.
Все более-менее понятно, кроме двух вещей:
1) Почему обязательно COM, а не flat API с хендлами?
2) Почему нельзя использовать исключения?
Фиг с ним с COM, это какая-то странная микрософтовская религия, но вот про исключения я не понимаю. Такое ощущение, что в С/С++ какие-то есть тонкости с исключениями, которых я не знаю и которые мешают их использовать.
По-моему, в начале метода гораздо проще выполнить проверки и кинуть исключение, которое обработается там, где юзер нашего API знает, что с ним делать, или показать пользователю сообщение об ошибке, которое будет показано тому, кто знает что с ним делать, чем проверять на каждом уровне вызовов коды возврата ВСЕХ вызовов, которые могут вернуть ошибку.
Причем try finally, по-моему, более простой вариант очистки выделенных ресурсов, чем куча goto и проверок.
UPD: Насчет исключений разъяснили. В c++ try/finally конструкция нестандартная, а вместо нее используется RAII (который еще и менее многословен, вообще-то).
Все более-менее понятно, кроме двух вещей:
1) Почему обязательно COM, а не flat API с хендлами?
2) Почему нельзя использовать исключения?
Фиг с ним с COM, это какая-то странная микрософтовская религия, но вот про исключения я не понимаю. Такое ощущение, что в С/С++ какие-то есть тонкости с исключениями, которых я не знаю и которые мешают их использовать.
По-моему, в начале метода гораздо проще выполнить проверки и кинуть исключение, которое обработается там, где юзер нашего API знает, что с ним делать, или показать пользователю сообщение об ошибке, которое будет показано тому, кто знает что с ним делать, чем проверять на каждом уровне вызовов коды возврата ВСЕХ вызовов, которые могут вернуть ошибку.
Причем try finally, по-моему, более простой вариант очистки выделенных ресурсов, чем куча goto и проверок.
UPD: Насчет исключений разъяснили. В c++ try/finally конструкция нестандартная, а вместо нее используется RAII (который еще и менее многословен, вообще-то).
no subject
(Anonymous) 2008-10-17 08:50 pm (UTC)(link)no subject
no subject
no subject
no subject
no subject
Да, надо вообще ради интереса скомпилировать и в IDA глянуть, потому что-то я давно смотрел и тонкостей не помню.
no subject
no subject
no subject
Это и с исключениями и с ручной обработкой одинаковая проблема будет.
no subject
int err;
err = do_some_work1();
if (err)
goto work1_failed;
err = do_some_work2();
if (err)
goto work2_failed;
return 0;
undo_work2();
work2_failed:
undo_work1()
work1_failed:
return err;
}
Как-то вот так.
no subject
no subject
Вот допустим по поводу полнолуния, захотел повызывать COM-вызовы из... Xslt преобразований, как мне там исключения обрабатывать?...
no subject
no subject
no subject
http://msdn.microsoft.com/en-us/library/9xtt5hxz(VS.80).aspx
no subject
У меня код содержит дофига finally, но гораздо меньше catch. Я бы мог использовать RAII для этого же случая, но .NET это дело не поддерживает (вернее там свой стиль для этого, с using IDisposable), а дельфи поддерживает только для COM-интерфейсов, которые я делать не люблю, т.к. мне проще руками управлять созданием и разрушеним объектов(я так лучше понимаю, кто чем владеет).
no subject
Плохо вы COM знаете...
СОМ-сервер не может кинуть исключение напрямую, да. Но вот вернуть HRESULT, по результату которого уже клиент запросит детальную информацию (IErrorInfo - http://msdn.microsoft.com/en-us/library/ms221233.aspx) и "перекинет" новое исключение (уже на клиентской стороне)
делается просто:
OLECheck(COMObject->InvokeMethod());
OLECheck просто проверяет HRESULT и, если надо, кидает правильно настроенный экзепшен
PS: А еще этот механизм называют safecall
no subject
То что вы описали, это просто механизм обработки исключительных ситуаций, и не волнуйтесь я вкурсе того как это делать, даже на plain C.
no subject
я не волнуюсь :)
no subject
no subject
А исключения - это throw, try, finally, catch
no subject
no subject
no subject
По-моему, COM излишне усложнен, но реализацию клиент-серверного взаимодействия между процессами на низкоуровневых языках по другому и не сделаешь, скорее всего.
no subject
no subject
Ситуация не та, конечно, но если есть возможность не использовать C++ exceptions, их не надо использовать. Имхо.
А COM, я думаю, потому что threading model и маршалинг сразу автоматически, это удобно.
no subject
no subject
no subject
Кстати в статье про SEH (этой http://msdn.microsoft.com/en-us/library/aa489626.aspx) прямым текстом написано:
Note that structured exception handling is distinct from C++ exceptions. The kernel does not support C++ exceptions.
no subject
no subject
Без дураков - я такого больше не видел ни в одном языке программирования.
Суть его очень проста и банальна - на _стеке_ создается некоторый объект, в конструкторе которого производиться захват ресурса, а в деструкторе - освобождение.
Например,
{
boost::scoped_lock lock( some_mutex ); // захватили мьютекс. В деструкторе освободим. Где бы ниже исключение не вылетело - он не останется висящим
std::shared_array< char > text( new char[ 100 ] ); // аналогично
//...
На основе этого построен паттерн "Транзакция"
http://insidecpp.ru/patterns/transaction/
no subject
У меня вот тоже крыша едет от этого всего. Встаешь, темным-темно за окном, домой приходишь, темно, на улице травка зеленая и вечный туман. Гадость... (http://www.spacedev.ru)
no subject
no subject