Как мы должны реализовать std:: error code compatible API?


Предположим, что мы пишем библиотеку и хотим обеспечить точный контроль ошибок и исключений:

void foo();
void foo(std::error_code&);

Должны ли мы реализовать foo() как бросание std::system_error и пусть foo(std::error_code&) ловит все исключения и извлекает error_code.

Или мы должны реализовать foo(std::error_code&) как никогда не бросающую функцию и бросить функцию в foo() в зависимости от наличия кода ошибки?

2 6

2 ответа:

boost библиотека работает с исключениями и с boost::system::error_code, поэтому, я думаю, вы можете ориентироваться на эту библиотеку. Например boost:: asio:: basic_stream_socket:: connect имеет две версии

void connect(
    const endpoint_type & peer_endpoint);

Boost:: system:: system_error брошен при сбое.

boost::system::error_code connect(
    const endpoint_type & peer_endpoint,
    boost::system::error_code & ec);

Ec устанавливает, чтобы указать, какая ошибка произошла, если таковая имеется.

Но это зависит от того, что делает foo, я тоже так думаю.

Чем меньше исключений, тем лучше, поэтому следует использовать второе.