J>>>Так что правильный путь, имхо — это дать возможность пользователю самому решить, что ему нужно, например, как делает boost.asio (можно и по-другому делать).
AS>>Но, имхо, не для каждого интерфейса. Либо делать 2 разных интерфейса с возможность move-upgrade одного в другой...
AS>>Вот этого бы не хотелось, на самом деле.
ЮЖ>Если модификация api невозможна, то можно такие варианты рассмотреть:
ЮЖ>// Дано:
ЮЖ>result api::f1(); // все nothrow
ЮЖ>result api::f2();
ЮЖ>result api::f3();
ЮЖ>// использование
ЮЖ>checked_result r(error_code1 | error_code2);
ЮЖ>r = api::f1();
ЮЖ>r = api::f2();
ЮЖ>r = api::f3();
ЮЖ>
ЮЖ>Объект checked_result в операторе присваивания проверяет аргумент на присутствие error_code1 или error_code2, и в случае обнаружения кидает исключение. Либо просто использует что-то вроде 'if(FAILED(hr)) throw ...'.
ЮЖ>Другой вариант — опять nothrow api, + легкие обертки-функторы:
Спасибо за ответ.
Да, про это все тоже думалось. В данном случае надо уменьшить бардак в коде, такие подходы его, на мой взгляд, поощряют — появляется куча условий на довольно высоком уровне. В общем, смысл от исключений тогда почти теряется. В общем, от исключений совсем отказываться не хочется, надо просто регламентировать ситуации...