ifstream f;
f.open(fileName);
if ( f.fail() )
{
// I need error message here, like "File not found" etc. -
// the reason of the failure
}
Jak uzyskać komunikat o błędzie w postaci ciągu?
c++
error-handling
stream
std
Alex F.
źródło
źródło
cerr << "Error code: " << strerror(errno); // Get some info as to why
wydaje się mieć znaczenie dla pytania.strerror(errno)
działa. Opublikuj to jako odpowiedź, zaakceptuję to.Odpowiedzi:
Każde niepowodzenie wywołania systemowego aktualizuje
errno
wartość.W ten sposób możesz uzyskać więcej informacji o tym, co się dzieje, gdy
ifstream
otwarcie się nie powiedzie, używając czegoś takiego:Ponieważ jednak każde wywołanie systemowe aktualizujeerrno
wartość globalną , mogą wystąpić problemy w aplikacji wielowątkowej, jeśli inne wywołanie systemowe wyzwoli błąd między wykonaniemf.open
a użyciemerrno
.W systemie ze standardem POSIX:
Edytuj (podziękowania dla Arne Mertza i innych osób w komentarzach):
e.what()
początkowo wydawało się, że jest to bardziej C ++ - idiomatycznie poprawny sposób implementacji tego, jednak ciąg zwracany przez tę funkcję jest zależny od implementacji i (przynajmniej w libstdc ++ w G ++) ten ciąg nie zawiera przydatnych informacji o przyczynie błędu ...źródło
e.what()
nie wydaje się udzielać wielu informacji, zobacz aktualizacje mojej odpowiedzi.errno
używa magazynu lokalnego wątku w nowoczesnych systemach operacyjnych. Nie ma jednak gwarancji, żefstream
funkcje nie będą blokować sięerrno
po wystąpieniu błędu. Podstawowe funkcje mogąerrno
w ogóle nie być ustawione (bezpośrednie wywołania systemowe w systemie Linux lub Win32). To nie działa w wielu rzeczywistych implementacjach.e.what()
zawsze wypisuje ten sam komunikat "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'
Możesz spróbować pozwolić strumieniowi zgłosić wyjątek w przypadku niepowodzenia:
e.what()
jednak nie wydaje się być zbyt pomocne:strerror(errno)
daje "No such file or directory".Jeśli
e.what()
nie działa dla Ciebie (nie wiem, co powie ci o błędzie, ponieważ nie jest to ustandaryzowane), spróbuj użyćstd::make_error_condition
(tylko C ++ 11):źródło
strerror(errno)
zamieszczone w komentarzach działa i jest bardzo proste w użyciu. Myślę, żee.what
to zadziała, ponieważerrno
działa.e.what()
będzie to tostrerror
, co powróci w sposób bezpieczny dla wątków. Oba będą prawdopodobnie zależne od platformy.exception.what()
. Może być dobra okazja, aby zagłębić się w kod źródłowy libstdc ++ :-)basic_ios::clear
, nic więcej. To nie jest naprawdę pomocne. Dlatego nie wysłałem;)Kontynuując odpowiedź @Arne Mertz, od C ++ 11
std::ios_base::failure
dziedziczy zsystem_error
(patrz http://www.cplusplus.com/reference/ios/ios_base/failure/ ), który zawiera zarówno kod błędu, jak i komunikat,strerror(errno)
który powróci.To jest drukowane,
No such file or directory.
jeślifileName
nie istnieje.źródło
iostream stream error
.iostream error
. Na jakim kompilatorze to przetestowałeś? Czy jakikolwiek kompilator faktycznie podaje czytelną dla użytkownika przyczynę niepowodzenia?unspecified iostream_category error
.Możesz również rzucić,
std::system_error
jak pokazano w kodzie testowym poniżej. Wydaje się, że ta metoda daje bardziej czytelne wyniki niżf.exception(...)
.Przykładowe dane wyjściowe (Ubuntu w / clang):
źródło