2017-09-22 3 views
1

私は例外をスローします(what is suggested hereと非常に似ている)、このコードを持っている:<system_error>のsystem_categoryエラーコードで汎用エラーコード列挙型を使用するにはどうすればよいですか?

int accept4(int sockfd, sockaddr *addr, socklen_t *addrlen, int flags) 
{ 
    const int fd = ::accept4(sockfd, addr, addrlen, flags); 
    if (fd < 0) 
    { 
     const auto tmp = errno; 
     throw ::std::system_error(tmp, ::std::system_category(), "accept4(2)"); 
    } 
    else 
    { 
     return fd; 
    } 
} 

そして、特定の例外の理由のためのテストのために、このコード:

catch (const ::std::system_error &e) 
{ 
    static const auto block_err = ::std::system_error(EWOULDBLOCK, 
                ::std::system_category()); 

    const auto ecode = e.code(); 

    // EWOULBLOCK is fine, everything else, re-throw it. 
    if (block_err.code() != ecode) 
    { 
     throw; 
    } 
} 

これは一種の不冗長ではないようです物事を行う正しい方法。この一般的なエラーのアイデアがあり、システム全体のエラーコードとこれらの一般的なエラーの間で変換するはずの何らかの種類のシステムとともに、それらの完全な列挙型(::std::errc参照)があります。

一般的なエラーコードとカテゴリを使用したいと思います。私はそれらを動作させることができません。どのように私はその仕事をするのですか?十分に高品質*の実装に

答えて

1

、それは

if (e.code() != std::errc::operation_would_block) 
    throw; 

を行うに足りるない場合、あなたは

if (e.code() != std::error_code(EWOULDBLOCK, std::system_category())) 
    throw; 

で立ち往生しているだけのために別のsystem_errorを構築する必要は確かにありません内部のエラーコード。 *


それは適切generic_category()にエラーをマップするためにsystem_category()default_error_conditionを実装する必要があります。

関連する問題