C++ Boost System超详细讲解

目录
  • 一、说明
  • 二、关于 Boost.System库

一、说明

以下库支持错误处理。

  • Boost.System 提供类来描述和识别错误。自 C++11 以来,这些类已成为标准库的一部分。
  • Boost.Exception 使得在抛出异常后附加数据成为可能。

二、关于 Boost.System库

Boost.System

Boost.System 是一个库,本质上定义了四个类来识别错误。所有四个类都已添加到 C++11 的标准库中。如果您的开发环境支持 C++11,则无需使用 Boost.System。然而,由于许多 Boost 库使用 Boost.System,您可能会通过其他库遇到 Boost.System。

boost::system::error_code 是 Boost.System 中最基本的类;它表示特定于操作系统的错误。因为操作系统通常会枚举错误,所以 boost::system::error_code 将错误代码保存在一个 int 类型的变量中。示例 55.1 说明了如何使用此类。

示例 55.1。使用 boost::system::error_code

#include <boost/system/error_code.hpp>
#include <iostream>
using namespace boost::system;
void fail(error_code &ec)
{
  ec = errc::make_error_code(errc::not_supported);
}
int main()
{
  error_code ec;
  fail(ec);
  std::cout << ec.value() << '\n';
}

Example55.1

示例 55.1 定义了用于返回错误的函数 fail()。为了让调用者检测 fail() 是否失败,boost::system::error_code 类型的对象通过引用传递。 Boost 库提供的许​​多函数都像这样使用 boost::system::error_code。例如,Boost.Asio 提供函数 boost::asio::ip::host_name(),您可以将类型为 boost::system::error_code 的对象传递给该函数。

Boost.System 在命名空间 boost::system::errc 中定义了许多错误代码。示例 55.1 将错误代码 boost::system::errc::not_supported 分配给 ec。因为 boost::system::errc::not_supported 是一个数字,而 ec 是 boost::system::error_code 类型的对象,所以函数 boost::system::errc::make_error_code() 被调用。此函数使用相应的错误代码创建一个类型为 boost::system::error_code 的对象。

在 main() 中,value() 在 ec 上被调用。此成员函数返回存储在对象中的错误代码。

默认情况下,0 表示没有错误。每隔一个数字表示一个错误。错误代码值取决于操作系统。有关错误代码的说明,请参阅操作系统的文档。

除了 value() 之外,boost::system::error_code 还提供了成员函数 category(),它返回一个 boost::system::error_category 类型的对象。

错误代码只是数值。虽然 Microsoft 等操作系统制造商能够保证系统错误代码的唯一性,但应用程序开发人员几乎不可能在所有现有应用程序中保持错误代码的唯一性。这将需要一个中央数据库,其中包含来自世界各地所有软件开发人员的错误代码,以避免为不同的错误重复使用相同的代码。因为这是不切实际的,所以存在错误类别。

boost::system::error_code 类型的错误代码属于可以使用成员函数 category() 检索的类别。使用 boost::system::errc::make_error_code() 创建的错误自动属于通用类别。如果错误未明确分配给另一个类别,则这是错误所属的类别。

示例 55.2。使用 boost::system::error_category

#include <boost/system/error_code.hpp>
#include <iostream>
using namespace boost::system;
void fail(error_code &ec)
{
  ec = errc::make_error_code(errc::not_supported);
}
int main()
{
  error_code ec;
  fail(ec);
  std::cout << ec.value() << '\n';
  std::cout << ec.category().name() << '\n';
}

如示例 55.2 所示,category() 返回错误的类别。这是一个类型为 boost::system::error_category 的对象。只有几个成员函数。例如,name() 检索类别的名称。示例 55.2 将泛型写入标准输出。

您还可以使用独立函数 boost::system::generic_category() 来访问通用类别。

Boost.System 提供了第二类。如果您调用独立函数 boost::system::system_category(),您将获得对系统类别的引用。如果您将类别的名称写入标准输出,则会显示系统。

错误由错误代码和错误类别唯一标识。因为错误代码只需要在一个类别中是唯一的,所以只要您想要定义特定于您的程序的错误代码,就应该创建一个新类别。这使得使用不干扰其他开发人员的错误代码的错误代码成为可能。

示例 55.3。创建错误类别

#include <boost/system/error_code.hpp>
#include <string>
#include <iostream>
class application_category :
  public boost::system::error_category
{
public:
  const char *name() const noexcept { return "my app"; }
  std::string message(int ev) const { return "error message"; }
};
application_category cat;
int main()
{
  boost::system::error_code ec{129, cat};
  std::cout << ec.value() << '\n';
  std::cout << ec.category().name() << '\n';
}

通过创建从 boost::system::error_category 派生的类来定义新的错误类别。这需要您定义各种成员函数。至少必须提供成员函数 name() 和 message(),因为它们在 boost::system::error_category 中被定义为纯虚拟成员函数。对于其他成员函数,如果需要,可以覆盖默认行为。

name() 返回错误类别的名称,而 message() 用于检索特定错误代码的错误描述。与示例 55.3 不同,通常评估参数 ev 以返回基于错误代码的描述。

新创建的错误类别类型的对象可用于初始化错误代码。示例 55.3 使用新类别 application_category 定义错误代码 ec。因此,错误代码 129 不再是一般错误;相反,它的含义由新错误类别的开发人员定义。

注意

要使用 Visual C++ 2013 编译示例 55.3,请删除关键字 noexcept。此版本的 Microsoft 编译器不支持 noexcept。

boost::system::error_code 提供了一个名为 default_error_condition() 的成员函数,它返回一个类型为 boost::system::error_condition 的对象。 boost::system::error_condition 的接口几乎与 boost::system::error_code 的接口相同。唯一的区别是成员函数 default_error_condition(),它仅由 boost::system::error_code 提供。

示例 55.4。使用 boost::system::error_condition

#include <boost/system/error_code.hpp>
#include <iostream>
using namespace boost::system;
void fail(error_code &ec)
{
  ec = errc::make_error_code(errc::not_supported);
}
int main()
{
  error_code ec;
  fail(ec);
  boost::system::error_condition ecnd = ec.default_error_condition();
  std::cout << ecnd.value() << '\n';
  std::cout << ecnd.category().name() << '\n';
}

boost::system::error_condition 就像 boost::system::error_code 一样使用。这就是为什么可以为类型为 boost::system::error_condition 的对象调用成员函数 value() 和 category() 的原因,如示例 55.4 所示。

类 boost::system::error_code 用于与平台相关的错误代码,而 boost::system::error_condition 用于访问与平台无关的错误代码。成员函数 default_error_condition() 将依赖于平台的错误代码转换为类型为 boost::system::error_condition 的平台无关错误代码。

您可以使用 boost::system::error_condition 来识别与平台无关的错误。例如,此类错误可能是对不存在文件的访问失败。虽然操作系统可能提供不同的接口来访问文件并可能返回不同的错误代码,但尝试访问不存在的文件在所有操作系统上都是错误的。从操作系统特定接口返回的错误代码存储在 boost::system::error_code 中。描述访问不存在文件失败的错误代码存储在 boost::system::error_condition 中。

Boost.System 提供的最后一个类是 boost::system::system_error,它派生自 std::runtime_error。它可用于在异常中传输类型为 boost::system::error_code 的错误代码。

示例 55.5。使用 boost::system::system_error

#include <boost/system/error_code.hpp>
#include <boost/system/system_error.hpp>
#include <iostream>
using namespace boost::system;
void fail()
{
  throw system_error{errc::make_error_code(errc::not_supported)};
}
int main()
{
  try
  {
    fail();
  }
  catch (system_error &e)
  {
    error_code ec = e.code();
    std::cerr << ec.value() << '\n';
    std::cerr << ec.category().name() << '\n';
  }
}

在示例 55.5 中,独立函数 fail() 已更改为在出现错误时抛出类型为 boost::system::system_error 的异常。此异常可以传输类型为 boost::system::error_code 的错误代码。异常在 main() 中捕获,它将错误代码和错误类别写入标准错误。函数 boost::asio::ip::host_name() 的第二个变体就像这样工作。

到此这篇关于C++ Boost System超详细讲解的文章就介绍到这了,更多相关C++ Boost System内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++ Boost.Signals2信号/槽概念

    目录 一.关于Boost.Signals2 二.关于Signals库 练习 一.关于Boost.Signals2 Boost.Signals2 实现了信号/槽的概念.一个或多个函数(称为槽)与可以发出信号的对象相关联.每次发出信号时,都会调用链接的函数. 信号/槽概念在开发具有图形用户界面的应用程序时非常有用.可以对按钮进行建模,以便在用户单击它们时发出信号.它们可以支持指向许多函数的链接以处理用户输入.这样就可以灵活地处理事件. std::function 也可用于事件处理. std::fun

  • C++ Boost Uuid超详细讲解

    目录 一.说明 二.Boost.Uuid库示例和代码 一.说明 Boost.Uuid 为 UUID 提供生成器. UUID 是不依赖于中央协调实例的通用唯一标识符.例如,没有数据库存储所有生成的 UUID,可以检查这些 UUID 是否使用了新的 UUID. UUID 由必须唯一标识组件的分布式系统使用.例如,Microsoft 使用 UUID 来识别 COM 世界中的接口.对于为 COM 开发的新接口,可以轻松分配唯一标识符. UUID 是 128 位数字.存在多种生成 UUID 的方法.例如,

  • C++ Boost Accumulators累加器详细讲解

    Boost.Accumulators Boost.Accumulators 提供了处理样本的类.例如,您可以找到最大或最小的样本,或者计算所有样本的总和.虽然标准库支持其中一些操作,但 Boost.Accumulators 还支持统计计算,例如均值和标准差. 该库称为 Boost.Accumulators,因为累加器是一个基本概念.累加器是一个容器,每次插入一个值时都会计算出一个新的结果.该值不一定存储在累加器中.相反,累加器在输入新值时不断更新中间结果. Boost.Accumulators

  • C++ Boost ProgramOptions超详细讲解

    目录 一.说明 二.示例Boost.ProgramOptions 一.说明 Boost.ProgramOptions Boost.ProgramOptions 是一个可以轻松解析命令行选项的库,例如,控制台应用程序.如果您使用图形用户界面开发应用程序,命令行选项通常并不重要. 要使用 Boost.ProgramOptions 解析命令行选项,需要以下三个步骤: 定义命令行选项.您给它们命名并指定哪些可以设置为一个值.如果命令行选项被解析为键/值对,您还可以设置值的类型——例如,它是字符串还是数字

  • C++ Boost log日志库超详细讲解

    目录 一.说明 二.库Boost.Log 一.说明 应用程序库是指通常专门用于独立应用程序开发而不用于库开发的库. Boost.Log 是一个日志库. Boost.ProgramOptions 是一个用于定义和解析命令行选项的库. Boost.Serialization 允许您序列化对象,例如,将它们保存到文件或从文件加载它们. Boost.Uuid 支持使用 UUID. 具体内容 62. Boost.Log 63. Boost.ProgramOptions 64. Boost.Serializ

  • C++ Boost Archive超详细讲解

    目录 一.说明 二.关于Archive库 一.说明 对Boost.Serialization库的应用,存在如下内容: Archive Pointers and References Serialization of Class Hierarchy Objects Wrapper Functions for Optimization Boost.Serialization 库可以将 C++ 程序中的对象转换为可以保存和加载以恢复对象的字节序列.有不同的数据格式可用于定义生成字节序列的规则. Boo

  • C++ Boost Flyweight库使用介绍

    目录 一.说明 二.库Boost.Flyweight 炼习 一.说明 以下库用于设计模式. Boost.Flyweight 有助于在程序中使用许多相同的对象并且需要减少内存消耗的情况. Boost.Signals2 使得使用观察者设计模式变得容易.这个库被称为 Boost.Signals2 因为它实现了信号/槽的概念. Boost.MetaStateMachine 使得将状态机从 UML 转移到 C++ 成为可能. 本节内容 66. Boost.Flyweight 67. Boost.Signa

  • C++ Boost Random随机函数详解

    目录 一.说明 二.示例代码 一.说明 Boost.Random 库提供了许多随机数生成器,可让您决定应如何生成随机数.在 C++ 中,始终可以使用来自 cstdlib 的 std::rand() 生成随机数.但是,使用 std::rand() 生成随机数的方式取决于标准库的实现方式. 当包含头文件 boost/random.hpp 时,您可以使用 Boost.Random 中的所有随机数生成器和其他类和函数. 该库的大部分已添加到 C++11 的标准库中.如果您的开发环境支持 C++11,您可

  • C++ Boost System超详细讲解

    目录 一.说明 二.关于 Boost.System库 一.说明 以下库支持错误处理. Boost.System 提供类来描述和识别错误.自 C++11 以来,这些类已成为标准库的一部分. Boost.Exception 使得在抛出异常后附加数据成为可能. 二.关于 Boost.System库 Boost.System Boost.System 是一个库,本质上定义了四个类来识别错误.所有四个类都已添加到 C++11 的标准库中.如果您的开发环境支持 C++11,则无需使用 Boost.Syste

  • C++ Boost Lockfree超详细讲解使用方法

    目录 一.说明 二.示例和代码 Boost.Lockfree 一.说明 Boost.Lockfree 提供线程安全和无锁容器.可以从多个线程访问此库中的容器,而无需同步访问. 在 1.56.0 版本中,Boost.Lockfree 只提供了两个容器:boost::lockfree::queue 类型的队列和 boost::lockfree::stack 类型的栈.对于队列,可以使用第二个实现:boost::lockfree::spsc_queue.此类针对只有一个线程写入队列和只有一个线程从队列

  • C++ Boost ScopeExit超详细讲解

    目录 一.提要 二.退出作用域(Boost.ScopeExit) 2.1 范例1.UsingBOOST_SCOPE_EXIT 2.2 示例2.Boost.ScopeExit和C++11的lambda函数 2.3 示例3.特点BOOST_SCOPE_EXIT 三.练习 一.提要 资源有很多种,每种都封装一套,还是挺繁琐的!对于比较少使用或者一个程序很可能只会用一次的资源,我们不想封装,在这种情况下用Boost.ScopeExit. 二.退出作用域(Boost.ScopeExit) 库 Boost.

  • C++ Boost Utility超详细讲解

    目录 一.说明 二.Boost.Utility库示例和代码 一.说明 Boost.Utility 库是杂项.有用的类和函数的集合,它们太小而无法在独立库中维护.虽然实用程序很小并且可以快速学习,但它们完全无关.与其他章节中的示例不同,此处的代码示例不是相互构建的,因为它们是独立的实用程序. 虽然大多数实用程序都在 boost/utility.hpp 中定义,但有些实用程序有自己的头文件.以下示例包括所介绍的实用程序的相应头文件. 二.Boost.Utility库示例和代码 示例 69.1.使用

  • C++ Boost Assign超详细讲解

    目录 说明 Exercise 说明 Boost.Assign Boost.Assign 库提供了帮助函数来初始化容器或向容器添加元素.如果需要将许多元素存储在一个容器中,这些函数尤其有用.多亏了 Boost.Assign 提供的函数,您不需要重复调​​用像 push_back() 这样的成员函数来将元素一个一个地插入到容器中. 如果您使用支持 C++11 的开发环境,则可以从初始化列表中获益.通常您可以将任意数量的值传递给构造函数来初始化容器.多亏了初始化列表,你不必依赖 C++11 的 Boo

  • C++ Boost Format超详细讲解

    Boost.Format Boost.Format 提供了函数 std::printf() 的替代品. std::printf() 源自 C 标准并允许格式化数据输出.但是,它既不是类型安全的,也不是可扩展的. Boost.Format 提供了一种类型安全且可扩展的替代方案. Boost.Format 提供了一个名为 boost::format 的类,该类在 boost/format.hpp 中定义.与 std::printf() 类似,将包含用于控制格式的特殊字符的字符串传递给 boost::

  • C++ Boost Exception超详细讲解

    Boost.Exception 库提供了一种新的异常类型 boost::exception,它允许您在抛出异常后将数据添加到异常中.此类型在 boost/exception/exception.hpp 中定义.由于 Boost.Exception 将其类和函数分布在多个头文件中,以下示例访问主头文件 boost/exception/all.hpp 以避免一个接一个地包含头文件. Boost.Exception 支持 C++11 标准的机制,该机制将异常从一个线程传输到另一个线程. boost::

随机推荐