Streams by default do not throw exceptions on error, they set flags. You can make them throw exceptions by using the stream's exception() member function:
ifstream ifs;
ifs.exceptions( std::ios::failbit ); // throw if failbit get set
Theoretically, you could then do something like this:
try {
int x;
ifs >> x;
}
catch( const std::exception & ex ) {
std::cerr << "Could not convert to int - reason is "
<< ex.what();
}
Unfortunately, the C++ Standard does not specify that thrown exceptions contain any error message, so you are in implementation specific territory here.
Short answer: no. Even checking errno
after you detect failure (using e.g. bad()
, fail()
) after various operations doesn't reliably work. Creating an ifstream
/ofstream
wrapping a file that can't be opened doesn't necessarily set a failure bit until you try to read, write, or close it.
Long answer: you can call ios::exceptions(ios_base::iostate)
to request that ios_base::ios_failure
exceptions be thrown when a corresponding bit (badbit, failbit, eofbit) is set, but this (at least on GNU and Microsoft C++ libraries) doesn't get you any more information than manually checking the bits, and ends up being largely pointless, IMHO.
From checking it out I found that also errno
and also GetLastError()
do set the last error and checking them is quite helpful. For getting the string message use:
strerror(errno);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With