Re[5]: api design: return code or exception - formal criteri
От: Юрий Жмеренецкий ICQ 380412032
Дата: 27.08.09 20:45
Оценка: 5 (3)
Здравствуйте, Andrew S, Вы писали:
...
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, + легкие обертки-функторы:

remove_file remove(std::nothrow); // любые ошибки игнорируются
std::for_each(v.begin(), v.end(), remove);

//...

// not_found трансформируется в исключение, 
// остальные ошибки просто возвращаются.
remove_file remove(not_found);

result r = remove(filename); 
if(r == access_denied)
{
  //...
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.