ifstream f;
f.open(fileName);
if ( f.fail() )
{
// I need error message here, like "File not found" etc. -
// the reason of the failure
}
Wie erhalte ich eine Fehlermeldung als Zeichenfolge?
c++
error-handling
stream
std
Alex F.
quelle
quelle
cerr << "Error code: " << strerror(errno); // Get some info as to why
scheint für die Frage relevant zu sein.strerror(errno)
funktioniert. Poste dies als Antwort, ich werde es akzeptieren.Antworten:
Jeder fehlgeschlagene Systemaufruf aktualisiert den
errno
Wert.Auf diese Weise können Sie weitere Informationen darüber erhalten, was passiert, wenn ein
ifstream
Öffnen fehlschlägt, indem Sie Folgendes verwenden:Da jedoch jeder Systemaufruf den globalenerrno
Wert aktualisiert , können Probleme in einer Multithread-Anwendung auftreten, wenn ein anderer Systemaufruf einen Fehler zwischen der Ausführung vonf.open
und der Verwendung von auslösterrno
.Auf einem System mit POSIX-Standard:
Bearbeiten (danke an Arne Mertz und andere Leute in den Kommentaren):
e.what()
schien zunächst eine C ++ - idiomatisch korrektere Art der Implementierung zu sein, jedoch ist die von dieser Funktion zurückgegebene Zeichenfolge implementierungsabhängig und (zumindest in G ++ 's libstdc ++) enthält diese Zeichenfolge keine nützlichen Informationen über den Grund für den Fehler ...quelle
e.what()
scheint nicht viele Informationen zu geben, siehe Aktualisierungen meiner Antwort.errno
Verwendet Thread-lokalen Speicher auf modernen Betriebssystemen. Es gibt jedoch keine Garantie dafür, dass diefstream
Funktionenerrno
nach einem Fehler nicht mehr funktionieren. Die zugrunde liegenden Funktionen sind möglicherweise überhaupt nicht festgelegterrno
(direkte Systemaufrufe unter Linux oder Win32). Dies funktioniert bei vielen Implementierungen in der realen Welt nicht.e.what()
immer die gleiche Nachricht "iostream stream error
"warning C4996: 'strerror': This function or variable may be unsafe. Consider using strerror_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1> C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\string.h(168) : see declaration of 'strerror'
Sie können versuchen, den Stream bei einem Fehler eine Ausnahme auslösen zu lassen:
e.what()
scheint jedoch nicht sehr hilfreich zu sein:strerror(errno)
gibt, während es "Keine solche Datei oder kein solches Verzeichnis" gibt.Wenn
e.what()
dies bei Ihnen nicht funktioniert (ich weiß nicht, was es Ihnen über den Fehler aussagt, da dieser nicht standardisiert ist), versuchen Sie es mitstd::make_error_condition
(nur C ++ 11):quelle
strerror(errno)
es in den Kommentaren veröffentlicht funktioniert und sehr einfach zu bedienen ist. Ich denke dase.what
wird funktionieren, daerrno
funktioniert.e.what()
wird aufstrerror
threadsichere Weise zurückkehren. Beide werden wahrscheinlich plattformabhängig sein.exception.what()
. Kann eine gute Gelegenheit sein, in den libstdc ++ Quellcode einzutauchen :-)basic_ios::clear
, sonst nichts. Das ist nicht wirklich hilfreich. Deshalb habe ich nicht gepostet;)Im Anschluss an die Antwort von @Arne Mertz
std::ios_base::failure
erbt ab C ++ 11 vonsystem_error
(siehe http://www.cplusplus.com/reference/ios/ios_base/failure/ ), die sowohl den Fehlercode als auch die Nachricht enthält,strerror(errno)
die zurückkehren würde.Dies wird gedruckt,
No such file or directory.
wennfileName
es nicht existiert.quelle
iostream stream error
.iostream error
. Auf welchem Compiler haben Sie das getestet? Gibt ein Compiler tatsächlich einen vom Benutzer lesbaren Grund für einen Fehler an?unspecified iostream_category error
.Sie können auch einen werfen,
std::system_error
wie im folgenden Testcode gezeigt. Diese Methode scheint eine besser lesbare Ausgabe zu erzeugen alsf.exception(...)
.Beispielausgabe (Ubuntu w / clang):
quelle