Tutorial :Get std::fstream failure error messages and/or exceptions



Question:

I'm using fstream. Is there any way to get the failure message/exception?

For example if I'm unable to open the file?


Solution:1

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.


Solution:2

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.


Solution:3

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);  

Note:If u also have question or solution just comment us below or mail us on toontricks1994@gmail.com
Previous
Next Post »