metaclass: (Default)
[personal profile] metaclass
Windows Imaging Component от разработчика Микрософт.

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

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

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

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

Date: 2008-10-18 12:00 am (UTC)
From: [identity profile] metaclass.livejournal.com
Я предварительно ссылки на ресурсы делаю нулл перед try, внутри try создаю, а затем в финалли грохаю те, которые не нулл, в обратном созданию порядке.

Date: 2008-10-18 06:01 am (UTC)
From: [identity profile] jek-hor.livejournal.com
Ага, т.е., от пачки ифов всё равно никуда не денешься :) Да и не всегда выделению ресурсов соответствует переменная (например, регистрация чего-нибудь в системе).

Date: 2008-10-18 08:00 am (UTC)
From: [identity profile] metaclass.livejournal.com
Если нет переменной - то как тогда определить выделился ли ресурс или нет и грохнуть его?
Это и с исключениями и с ручной обработкой одинаковая проблема будет.

Date: 2008-10-19 03:32 pm (UTC)
From: [identity profile] jek-hor.livejournal.com
{
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;
}

Как-то вот так.

Profile

metaclass: (Default)
metaclass

April 2017

S M T W T F S
      1
2345678
9101112 131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 12th, 2025 10:38 pm
Powered by Dreamwidth Studios