std::exception
    This proposal defines standard exception information types compatible with N3757.
Defining standard exception information types improves compatibility between programs and libraries that throw and/or handle exceptions.
Defining standard exception information types as proposed supplements N3757 and does not affect any other parts of the standard library.
        In the standard header <exception> add the following type definitions in namespace std (refer to
        N3757 for the definition of set<>):
    
| Type | Description | 
|---|---|
struct errinfo_throw_function
{
  typedef char const * type;
};
struct errinfo_throw_file
{
  typedef char const * type;
};
struct errinfo_throw_line
{
  typedef int type;
}; | 
            
                 These types specify the name of the function, the source file name and line number containing the   | 
        
struct errinfo_api_function
{
  typedef char const * type;
}; | 
            
                 Used when throwing exceptions in case a call to a no-throw API function fails, to indicate the name of that function. For example: fread(ptr,size,count,f);
if( ferror(f) )
{
  file_error e; //derives from std::exception
  e.set<errinfo_api_function>("fread");
  throw e;
}
                
             | 
        
struct errinfo_file_name
{
  typedef std::string type;
}; | 
            Specifies a relevant file name for exceptions used to report file errors, using UTF-8 encoding. Example: try
{
  FILE * f=fopen("name","rb");
  if( !f )
    throw file_open_error(); //derives from std::exception
  .....
}
catch( std::exception & e )
{
  e.set<errinfo_file_name>("name");
  throw;
}
             | 
        
struct errinfo_fileno
{
  typedef int type;
};
struct errinfo_file
{
  typedef FILE * type;
}; | 
            These types can be used to specify a relevant file descriptor or   | 
        
struct errinfo_errno
{
  typedef errno_code type;
};
                where  struct errno_code
{
  int value;
  errno_code(int value):
    value(value)
  {
  }
}; | 
            
                 
                    Specifies a relevant  ostream & operator<<( ostream & _S, errno_code const & _X )
{
  return _S << _X.value << '(' << strerror(_X.value) << ')';
}
             | 
        
A proof of concept implementation for N3757 is available in Boost. See boost/exception/N3757.hpp and libs/exception/test/N3757_test.cpp in http://svn.boost.org/svn/boost/trunk.