Об исключениях
Oct. 17th, 2008 11:34 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
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
Date: 2008-10-24 09:03 pm (UTC)Плохо вы COM знаете...
СОМ-сервер не может кинуть исключение напрямую, да. Но вот вернуть HRESULT, по результату которого уже клиент запросит детальную информацию (IErrorInfo - http://msdn.microsoft.com/en-us/library/ms221233.aspx) и "перекинет" новое исключение (уже на клиентской стороне)
делается просто:
OLECheck(COMObject->InvokeMethod());
OLECheck просто проверяет HRESULT и, если надо, кидает правильно настроенный экзепшен
PS: А еще этот механизм называют safecall
no subject
Date: 2008-10-24 09:10 pm (UTC)То что вы описали, это просто механизм обработки исключительных ситуаций, и не волнуйтесь я вкурсе того как это делать, даже на plain C.
no subject
Date: 2008-10-24 09:28 pm (UTC)я не волнуюсь :)