You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
131 lines
2.8 KiB
131 lines
2.8 KiB
// |
|
// system_error.hpp |
|
// ~~~~~~~~~~~~~~~~ |
|
// |
|
// Copyright (c) 2003-2018 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
|
|
|