ifstream f;
f.open(fileName);
if ( f.fail() )
{
// I need error message here, like "File not found" etc. -
// the reason of the failure
}
Como obter uma mensagem de erro como string?
c++
error-handling
stream
std
Alex F
fonte
fonte
cerr << "Error code: " << strerror(errno); // Get some info as to why
parece relevante para a questão.strerror(errno)
funciona. Poste isso como resposta, vou aceitar.Respostas:
Cada chamada de sistema que falha atualiza o
errno
valor.Assim, você pode ter mais informações sobre o que acontece quando uma
ifstream
abertura falha usando algo como:No entanto, como cada chamada de sistema atualiza oerrno
valor global , você pode ter problemas em um aplicativo multithread se outra chamada de sistema disparar um erro entre a execução def.open
e o uso deerrno
.No sistema com padrão POSIX:
Editar (obrigado a Arne Mertz e outras pessoas nos comentários):
e.what()
parecia a princípio ser uma forma mais C ++ - idiomicamente correta de implementar isso, no entanto, a string retornada por esta função é dependente da implementação e (pelo menos no libstdc ++ do G ++) esta string não tem informações úteis sobre o motivo do erro ...fonte
e.what()
não parece dar muitas informações, veja atualizações na minha resposta.errno
usa armazenamento local de thread em sistemas operacionais modernos. No entanto, não há garantia de que asfstream
funções não serão destruídaserrno
após a ocorrência de um erro. As funções subjacentes podem não ser definidaserrno
(chamadas de sistema diretas no Linux ou Win32). Isso não funciona em muitas implementações do mundo real.e.what()
sempre imprime a mesma mensagem "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'
Você pode tentar deixar o fluxo lançar uma exceção em caso de falha:
e.what()
, no entanto, não parece ser muito útil:strerror(errno)
fornece "Nenhum arquivo ou diretório."Se
e.what()
não funcionar para você (não sei o que dirá sobre o erro, já que não é padronizado), tente usarstd::make_error_condition
(somente C ++ 11):fonte
strerror(errno)
postado nos comentários funciona e é muito simples de usar. Acho quee.what
vai funcionar, poiserrno
funciona.e.what()
será o questrerror
retornará, de uma maneira threadsafe. Ambos provavelmente dependerão da plataforma.exception.what()
. Pode ser uma boa oportunidade para mergulhar no código-fonte libstdc ++ :-)basic_ios::clear
, nada mais Isso não ajuda muito. É por isso que nãoSeguindo a resposta de @Arne Mertz, a partir de C ++ 11
std::ios_base::failure
herda desystem_error
(consulte http://www.cplusplus.com/reference/ios/ios_base/failure/ ), que contém o código de erro e a mensagem questrerror(errno)
retornaria.Isso imprime
No such file or directory.
sefileName
não existir.fonte
iostream stream error
.iostream error
. Em qual compilador você testou isso? Algum compilador realmente fornece uma razão legível pelo usuário para a falha?unspecified iostream_category error
.Você também pode lançar um
std::system_error
conforme mostrado no código de teste abaixo. Este método parece produzir uma saída mais legível do quef.exception(...)
.Exemplo de saída (Ubuntu com clang):
fonte