example_io.cpp
来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 216 行
CPP
216 行
//Copyright (c) 2006-2008 Emil Dotchevski and Reverge Studios, Inc.//Distributed under the Boost Software License, Version 1.0. (See accompanying//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)//This program simulates errors on copying simple data files.//It demonstrates how the proposed Boost exception library can be used.////The documentation for boost::exception can be found at://// http://www.revergestudios.com/boost-exception/boost-exception.htm.////The output from this program can vary depending on the compiler/OS combination.#include <boost/exception.hpp>#include <boost/shared_ptr.hpp>#include <boost/weak_ptr.hpp>#include <stdio.h>#include <errno.h>#include <string>#include <iostream>typedef boost::error_info<struct tag_errno,int> errno_info;typedef boost::error_info<struct tag_file_stream,boost::weak_ptr<FILE> > file_stream_info;typedef boost::error_info<struct tag_open_mode,std::string> open_mode_info; //The open mode of a failed fopen request.typedef boost::error_info<struct tag_file_name,std::string> file_name_info; //The file name of a failed file operation.typedef boost::error_info<struct tag_file_name_src,std::string> file_name_src_info; //The source file name of a failed copy operation.typedef boost::error_info<struct tag_file_name_dst,std::string> file_name_dst_info; //The destination file name of a failed copy operation.typedef boost::error_info<struct tag_function,std::string> function_info; //The name of the C function which reported the failure.char const data[] = "example";size_t const data_size = sizeof(data);classerror: //Base for all exception objects we throw. public std::exception, public boost::exception { public: char const * what() const throw() { return "example_io error"; } protected: ~error() throw() { } };class open_error: public error { };class read_error: public error { };class write_error: public error { };class fopen_error: public open_error { };class fread_error: public read_error { };class fwrite_error: public write_error { };boost::shared_ptr<FILE>my_fopen( char const * name, char const * mode ) { if( FILE * f = ::fopen(name,mode) ) return boost::shared_ptr<FILE>(f,fclose); else BOOST_THROW_EXCEPTION(fopen_error() << errno_info(errno) << file_name_info(name) << open_mode_info(mode) << function_info("fopen")); }voidmy_fread( void * buffer, size_t size, size_t count, boost::shared_ptr<FILE> const & stream ) { assert(stream); if( count!=fread(buffer,size,count,stream.get()) || ferror(stream.get()) ) BOOST_THROW_EXCEPTION(fread_error() << function_info("fread") << errno_info(errno) << file_stream_info(boost::weak_ptr<FILE>(stream))); }voidmy_fwrite( void const * buffer, size_t size, size_t count, boost::shared_ptr<FILE> const & stream ) { assert(stream); if( count!=fwrite(buffer,size,count,stream.get()) || ferror(stream.get()) ) BOOST_THROW_EXCEPTION(fwrite_error() << function_info("fwrite") << errno_info(errno) << file_stream_info(boost::weak_ptr<FILE>(stream))); }voidreset_file( char const * file_name ) { (void) my_fopen(file_name,"wb"); }voidcreate_data( char const * file_name ) { boost::shared_ptr<FILE> f = my_fopen(file_name,"wb"); my_fwrite( data, 1, data_size, f ); }voidcopy_data( char const * src_file_name, char const * dst_file_name ) { boost::shared_ptr<FILE> src = my_fopen(src_file_name,"rb"); boost::shared_ptr<FILE> dst = my_fopen(dst_file_name,"wb"); try { char buffer[data_size]; my_fread( buffer, 1, data_size, src ); my_fwrite( buffer, 1, data_size, dst ); } catch( boost::exception & x ) { if( boost::shared_ptr<boost::weak_ptr<FILE> const> f=boost::get_error_info<file_stream_info>(x) ) if( boost::shared_ptr<FILE> fs = f->lock() ) { if( fs==src ) x << file_name_info(src_file_name); else if( fs==dst ) x << file_name_info(dst_file_name); } x << file_name_src_info(src_file_name) << file_name_dst_info(dst_file_name); throw; } }voiddump_copy_info( boost::exception const & x ) { if( boost::shared_ptr<std::string const> src = boost::get_error_info<file_name_src_info>(x) ) std::cout << "Source file name: " << *src << "\n"; if( boost::shared_ptr<std::string const> dst = boost::get_error_info<file_name_dst_info>(x) ) std::cout << "Destination file name: " << *dst << "\n"; }voiddump_file_info( boost::exception const & x ) { if( boost::shared_ptr<std::string const> fn = boost::get_error_info<file_name_info>(x) ) std::cout << "File name: " << *fn << "\n"; }voiddump_clib_info( boost::exception const & x ) { if( boost::shared_ptr<int const> err=boost::get_error_info<errno_info>(x) ) std::cout << "OS error: " << *err << "\n"; if( boost::shared_ptr<std::string const> fn=boost::get_error_info<function_info>(x) ) std::cout << "Failed function: " << *fn << "\n"; }voiddump_all_info( boost::exception const & x ) { std::cout << "-------------------------------------------------\n"; dump_copy_info(x); dump_file_info(x); dump_clib_info(x); std::cout << "\nOutput from diagnostic_information():\n"; std::cout << diagnostic_information(x); }intmain() { try { create_data( "tmp1.txt" ); copy_data( "tmp1.txt", "tmp2.txt" ); //This should succeed. reset_file( "tmp1.txt" ); //Creates empty file. try { copy_data( "tmp1.txt", "tmp2.txt" ); //This should fail, tmp1.txt is empty. } catch( read_error & x ) { std::cout << "\nCaught 'read_error' exception.\n"; dump_all_info(x); } remove( "tmp1.txt" ); remove( "tmp2.txt" ); try { copy_data( "tmp1.txt", "tmp2.txt" ); //This should fail, tmp1.txt does not exist. } catch( open_error & x ) { std::cout << "\nCaught 'open_error' exception.\n"; dump_all_info(x); } } catch( boost::exception & x ) { std::cout << "\nCaught unexpected boost::exception!\n"; dump_all_info(x); } }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?