132 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
		
		
			
		
	
	
			132 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
|  | //
 | ||
|  | // system_error.hpp
 | ||
|  | // ~~~~~~~~~~~~~~~~
 | ||
|  | //
 | ||
|  | // Copyright (c) 2003-2023 Christopher M. Kohlhoff (chris at kohlhoff dot com)
 | ||
|  | //
 | ||
|  | // 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)
 | ||
|  | //
 | ||
|  | 
 | ||
|  | #ifndef ASIO_SYSTEM_ERROR_HPP
 | ||
|  | #define ASIO_SYSTEM_ERROR_HPP
 | ||
|  | 
 | ||
|  | #if defined(_MSC_VER) && (_MSC_VER >= 1200)
 | ||
|  | # pragma once
 | ||
|  | #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
 | ||
|  | 
 | ||
|  | #include "asio/detail/config.hpp"
 | ||
|  | 
 | ||
|  | #if defined(ASIO_HAS_STD_SYSTEM_ERROR)
 | ||
|  | # include <system_error>
 | ||
|  | #else // defined(ASIO_HAS_STD_SYSTEM_ERROR)
 | ||
|  | # include <cerrno>
 | ||
|  | # include <exception>
 | ||
|  | # include <string>
 | ||
|  | # include "asio/error_code.hpp"
 | ||
|  | # include "asio/detail/scoped_ptr.hpp"
 | ||
|  | #endif // defined(ASIO_HAS_STD_SYSTEM_ERROR)
 | ||
|  | 
 | ||
|  | #include "asio/detail/push_options.hpp"
 | ||
|  | 
 | ||
|  | namespace asio { | ||
|  | 
 | ||
|  | #if defined(ASIO_HAS_STD_SYSTEM_ERROR)
 | ||
|  | 
 | ||
|  | typedef std::system_error system_error; | ||
|  | 
 | ||
|  | #else // defined(ASIO_HAS_STD_SYSTEM_ERROR)
 | ||
|  | 
 | ||
|  | /// The system_error class is used to represent system conditions that
 | ||
|  | /// prevent the library from operating correctly.
 | ||
|  | class system_error | ||
|  |   : public std::exception | ||
|  | { | ||
|  | public: | ||
|  |   /// Construct with an error code.
 | ||
|  |   system_error(const error_code& ec) | ||
|  |     : code_(ec), | ||
|  |       context_() | ||
|  |   { | ||
|  |   } | ||
|  | 
 | ||
|  |   /// Construct with an error code and context.
 | ||
|  |   system_error(const error_code& ec, const std::string& context) | ||
|  |     : code_(ec), | ||
|  |       context_(context) | ||
|  |   { | ||
|  |   } | ||
|  | 
 | ||
|  |   /// Copy constructor.
 | ||
|  |   system_error(const system_error& other) | ||
|  |     : std::exception(other), | ||
|  |       code_(other.code_), | ||
|  |       context_(other.context_), | ||
|  |       what_() | ||
|  |   { | ||
|  |   } | ||
|  | 
 | ||
|  |   /// Destructor.
 | ||
|  |   virtual ~system_error() throw () | ||
|  |   { | ||
|  |   } | ||
|  | 
 | ||
|  |   /// Assignment operator.
 | ||
|  |   system_error& operator=(const system_error& e) | ||
|  |   { | ||
|  |     context_ = e.context_; | ||
|  |     code_ = e.code_; | ||
|  |     what_.reset(); | ||
|  |     return *this; | ||
|  |   } | ||
|  | 
 | ||
|  |   /// Get a string representation of the exception.
 | ||
|  |   virtual const char* what() const throw () | ||
|  |   { | ||
|  | #if !defined(ASIO_NO_EXCEPTIONS)
 | ||
|  |     try | ||
|  | #endif // !defined(ASIO_NO_EXCEPTIONS)
 | ||
|  |     { | ||
|  |       if (!what_.get()) | ||
|  |       { | ||
|  |         std::string tmp(context_); | ||
|  |         if (tmp.length()) | ||
|  |           tmp += ": "; | ||
|  |         tmp += code_.message(); | ||
|  |         what_.reset(new std::string(tmp)); | ||
|  |       } | ||
|  |       return what_->c_str(); | ||
|  |     } | ||
|  | #if !defined(ASIO_NO_EXCEPTIONS)
 | ||
|  |     catch (std::exception&) | ||
|  |     { | ||
|  |       return "system_error"; | ||
|  |     } | ||
|  | #endif // !defined(ASIO_NO_EXCEPTIONS)
 | ||
|  |   } | ||
|  | 
 | ||
|  |   /// Get the error code associated with the exception.
 | ||
|  |   error_code code() const | ||
|  |   { | ||
|  |     return code_; | ||
|  |   } | ||
|  | 
 | ||
|  | private: | ||
|  |   // The code associated with the error.
 | ||
|  |   error_code code_; | ||
|  | 
 | ||
|  |   // The context associated with the error.
 | ||
|  |   std::string context_; | ||
|  | 
 | ||
|  |   // The string representation of the error.
 | ||
|  |   mutable asio::detail::scoped_ptr<std::string> what_; | ||
|  | }; | ||
|  | 
 | ||
|  | #endif // defined(ASIO_HAS_STD_SYSTEM_ERROR)
 | ||
|  | 
 | ||
|  | } // namespace asio
 | ||
|  | 
 | ||
|  | #include "asio/detail/pop_options.hpp"
 | ||
|  | 
 | ||
|  | #endif // ASIO_SYSTEM_ERROR_HPP
 |