2012-08-29 9 views
44

C++ 11の新しい<system_error>ヘッダーについて考えてseries of blog postsを読んでいます。このヘッダは、操作(システムコールなど)によって返される特定のエラー値を表すerror_codeクラスを定義していると言います。ヘッダーにはsystem_errorクラスが定義されています。これは例外クラス(runtime_exceptionから継承)で、error_codesをラップするために使用されます。<system_error>を使用してerrnoを例外に変換する方法

私が知りたいのは、実際にシステムエラーをerrnoからsystem_errorに変換する方法です。私はそれを投げることができます。たとえば、POSIX open関数は、-1を返してerrnoを設定することによってエラーを報告します。したがって、例外をスローしたい場合は、以下のコードをどのように完了する必要がありますか?

void x() 
{ 
    fd = open("foo", O_RDWR); 
    if (fd == -1) 
    { 
     throw /* need some code here to make a std::system_error from errno */; 
    } 
} 

は私がランダムに試みた:

errno = ENOENT; 
throw std::system_error(); 

しかし、得られた例外は、what()が呼び出されない情報を返していません。

私はを行うことができると知っていますが、新しい<system_error>ヘッダーを使用して正しい方法で行いたいと思います。私はちょうどその残りは明らかであるerrnoerror_codeに変換することができますので、もし、その引数として単一error_codeを取るsystem_errorのコンストラクタがあり

これは本当に基本的なものだと思われるので、なぜ私はそれについて良いチュートリアルを見つけることができないのかわかりません。

ARMプロセッサでgcc 4.4.5を使用しています。

答えて

49

あなたは正しい軌道に乗っている、単にエラーコードとstd::system_errorconstructorからstd::system_categoryオブジェクトを渡すと、それが動作するはずです:

例:私のシステム上で、上記のプログラムから

#include <iostream> 
#include <system_error> 

int main() 
{ 
    try 
    { 
     throw std::system_error(EFAULT, std::system_category()); 
    } 
    catch (std::system_error& error) 
    { 
     std::cout << "Error: " << error.code() << " - " << error.what() << '\n'; 
    } 
} 

出力は

 
Error: system:14 - Bad address 
+0

です。なんらかの理由で、私のシステムではまったく同じコードが "Error:system:14 - "を出力しますが、libstdC++などの最新バージョンを使用していない可能性があります。 –

+3

同じ問題を抱えている人は、 'error.what()'は空文字列を返しますが、 'error.code()。message()'はnice文字列を返します。 –

+4

あなたは 'std :: system_error(EFAULT、std :: system_category());' – Cubbi