# Boost Exception

### errinfo_file_handle

#include <boost/exception/errinfo_file_handle.hpp>

    #include <boost/exception/error_info.hpp>

    namespace
    boost
        {
        template <class> class weak_ptr;
        typedef error_info<struct errinfo_file_handle_,weak_ptr<FILE> > errinfo_file_handle;
        }

This type is designed to be used as a standard error_info instance for transporting a relevant FILE pointer managed by a boost::shared_ptr<FILE> in exceptions deriving from boost::exception.

### Example:

    #include <boost/exception/errinfo_api_function.hpp>
    #include <boost/exception/errinfo_at_line.hpp>
    #include <boost/exception/errinfo_errno.hpp>
    #include <boost/exception/errinfo_file_handle.hpp>
    #include <boost/exception/errinfo_file_name.hpp>
    #include <boost/exception/errinfo_file_open_mode.hpp>
    #include <boost/exception/info.hpp>
    #include <boost/throw_exception.hpp>
    #include <boost/shared_ptr.hpp>
    #include <boost/weak_ptr.hpp>
    #include <stdio.h>
    #include <errno.h>
    #include <exception>

    struct error : virtual std::exception, virtual boost::exception { };
    struct file_error : virtual error { };
    struct file_open_error: virtual file_error { };
    struct file_read_error: virtual file_error { };

    boost::shared_ptr<FILE>
    open_file( char const * file, char const * mode )
        {
        if( FILE * f=fopen(file,mode) )
            return boost::shared_ptr<FILE>(f,fclose);
        else
            BOOST_THROW_EXCEPTION(
                file_open_error() <<
                boost::errinfo_api_function("fopen") <<
                boost::errinfo_errno(errno) <<
                boost::errinfo_file_name(file) <<
                boost::errinfo_file_open_mode(mode) );
        }

    size_t
    read_file( boost::shared_ptr<FILE> const & f, void * buf, size_t size )
        {
        size_t nr=fread(buf,1,size,f.get());
        if( ferror(f.get()) )
            BOOST_THROW_EXCEPTION(
                file_read_error() <<
                boost::errinfo_api_function("fread") <<
                boost::errinfo_errno(errno) <<
                boost::errinfo_file_handle(f) );
        return nr;
        }

See also: boost/exception/errinfo_file_handle.hpp