Cada chamada de sistema que falha atualiza o errnovalor.
Assim, você pode ter mais informações sobre o que acontece quando uma ifstreamabertura falha usando algo como:
cerr << "Error: " << strerror(errno);
No entanto, como cada chamada de sistema atualiza o errnovalor global , você pode ter problemas em um aplicativo multithread se outra chamada de sistema disparar um erro entre a execução de f.opene o uso de errno.
No sistema com padrão POSIX:
errno é thread local; configurá-lo em um thread não afeta seu valor em nenhum outro thread.
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 ...