2012-09-15 17 views
6

Zakładając piszemy bibliotekę i że chcemy, aby zapewnić precyzyjną kontrolę nad ziarna błędu i wyjątki:W jaki sposób powinniśmy wdrożyć API kompatybilne ze std :: error_code?

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

sould wdrożymy foo() jak rzucanie std::system_error i niech foo(std::error_code&) złapać wszystkie wyjątek i rozpakowania kod_błędu.

Czy możemy zaimplementować foo(std::error_code&) jako funkcję nigdy nie rzucającą i rzucać funkcją w foo() w zależności od obecności kodu błędu?

+1

Zobacz na przykład :: :: asio. http://www.boost.org/doc/libs/1_51_0/doc/html/boost_asio/reference/basic_stream_socket/connect.html – ForEveR

+1

Powiedziałbym, że zależy to również od tego, co robi 'foo()'. – netcoder

Odpowiedz

3

boost Biblioteka działa z wyjątkami iz boost::system::error_code, więc myślę, że możesz zorientować się w tej bibliotece. Na przykład boost::asio::basic_stream_socket::connect ma dwie wersje

void connect(
    const endpoint_type & peer_endpoint); 

boost :: System :: system_error rzucony na niepowodzenie.

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

ec Zestaw do wskazania co wystąpił błąd, jeśli w ogóle.

Ale to zależy od tego, co robi foo.

-4

Mniej wyjątków jest zawsze lepiej, więc powinieneś użyć drugiego.

Powiązane problemy