2012-08-29 6 views
44

Ich las eine nachdenkliche series of blog posts über die neue <system_error> Header in C++ 11. Es besagt, dass der Header eine error_code Klasse definiert, die einen bestimmten Fehlerwert darstellt, der von einer Operation (wie einem Systemaufruf) zurückgegeben wird. Es besagt, dass der Header eine system_error-Klasse definiert, die eine Ausnahmeklasse ist (erbt von runtime_exception) und zum Umbrechen von error_codes s verwendet wird.Wie errno in die Ausnahme konvertieren mit <system_error>

Was ich wissen will ist, wie man tatsächlich einen Systemfehler von errno in system_error umwandelt, damit ich es werfen kann. Zum Beispiel meldet die POSIX-Funktion open Fehler, indem sie -1 zurückgibt und errno setzt. Wenn ich also eine Ausnahme auslösen möchte, wie soll ich den folgenden Code vervollständigen?

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

ich zufällig versucht:

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

aber die resultierende Ausnahme gibt keine Information, wenn what() genannt wird.

Ich weiß, ich könnte tun, aber ich möchte es richtig machen, mit der neuen <system_error> Header.

Es ist ein Konstruktor für system_error, die ein einzelnes error_code als Argument, so, wenn ich nur errno-error_code umwandeln kann dann der Rest sollte klar sein.

Das scheint eine wirklich einfache Sache zu sein, also weiß ich nicht, warum ich kein gutes Tutorial dazu finden kann.

Ich verwende gcc 4.4.5 auf einem ARM-Prozessor, wenn das wichtig ist.

Antwort

49

Sie sind auf dem richtigen Weg, geben Sie einfach den Fehlercode und ein std::system_category Objekt an die std::system_errorconstructor und es sollte funktionieren:

Beispiel:

#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'; 
    } 
} 

Ausgabe aus dem obigen Programm auf meinem System ist

 
Error: system:14 - Bad address 
+0

Cool, das funktioniert! Aus irgendeinem Grund gibt derselbe Code auf meinem System nur "Error: system: 14 -" aus, aber ich benutze wahrscheinlich nicht die neueste Version von libstdC++ oder so. –

+3

Für alle anderen mit dem gleichen Problem, fand ich, dass 'error.what()' gibt eine leere Zeichenfolge zurück, aber 'error.code(). Message()' gibt eine nette Zeichenfolge zurück. –

+4

Kannst du nicht einfach 'std :: system_error (EFAULT, std :: system_category()) werfen;' – Cubbi

Verwandte Themen