C++11(或 Boost)system_error 策略

标签 c++ c++11 boost std-system-error

我正在开发一个系统,该系统旨在使用名为 error_codeerror_conditionerror_category 的类——一个新的方案std:在 C++11 中,尽管目前我实际上正在使用 Boost 实现。我读过 Chris Kholkoff 的 series of articles ,现在三遍了,我想我了解了如何创建这些类。

我的问题是这个系统需要处理存在于单个 DLL 中的插件,而插件可能会出错。我最初的设计是计划一个特定于系统的错误类别,该类别将包含所有各种错误代码和未真正映射到 errno 值的特定错误条件的候选列表。这里的问题是,要使 DLL 能够使用这些错误代码之一,它需要访问应用程序中 error_category 的唯一实例。我现在通过从每个 DLL 中导出一个 SetErrorCategory() 函数来处理这个问题,它可以工作但是有点恶心。

我看到的替代解决方案是每个 DLL 都有自己的错误类别和代码,如果需要,还有自己的条件;我怀疑这更像是为这个库功能所设想的。但是,我认为这需要在主应用程序的错误方案中有一个比较函数,该函数了解插件的错误方案,并可以检查哪些应用程序的条件与插件的错误相匹配。这似乎更容易出现一堆问题,尽管我还没有尝试实现它。我猜我必须在所有实际逻辑之上从 DLL 导出整个错误方案。

当然,另一种方法是仅使用 DLL 中的数字错误代码并将它们填充到应用程序端的错误对象中。它具有插件简单的优点,但可能会导致应用程序出现问题(例如,一个函数处理来自几个不同插件的对象需要注意每个错误的来源)。

所以我的具体问题是:在这三个选项中,您会使用哪个,为什么?哪个明显行不通?当然,还有我没有想到的更好的方法吗?

最佳答案

我在处理这个问题时得出的解决方案是使用预定义代码来处理问题系列和用户子代码选择,以及针对特定错误类型的继承。使用 boost 这让我可以通过以下方式继承特定类型:

struct IOException : virtual std::exception, virtual boost::exception {};
struct EOFException : IOException {};
...

并保留与 IOException 等预定义一般错误相匹配的错误代码。因此,我可以为每个错误系列提供一个通用代码范围:

namespace exception { namespace code {
    UNKNOWN_EXCEPTION           = 0;
    IO_EXCEPTION                = 100;
    CONCURRENCY_EXCEPTION       = 200;
    ...
}}

然后,如果有人想要一个新的错误类型,他们可以从已经定义的通用异常类型和与该错误一起出现的代码继承,并通过继承类型和次要值 (0-99) 专门化异常。这也允许 try catch block 捕获更具体的错误类型,同时让更通用的异常版本传递给其他控制 block 。然后用户可以自由使用父异常代码或指定他们自己的家庭代码(parent = 100 -> child = 115)。如果用户只是想要一个 IOError,而不需要创建新的错误系列,他们可以毫不费力地使用默认的系列异常。我发现这为用户提供了灵 active ,而无需 OCD 在他们不想要时跟踪异常代码。

然而,这绝不是最终的解决方案,因为个人偏好引导了我在这里的设计选择。我发现有太多的错误代码变得困惑,异常继承已经编码了这个信息。实际上,在我描述的系统中,很容易完全去除错误代码并仅依赖异常继承,但许多人更喜欢为每个异常名称分配一个代码。

关于C++11(或 Boost)system_error 策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12169495/

相关文章:

c++ - 有什么方法可以在不复制的情况下从 std::ostringstream 获取 std::string_view ?

c++ - std::regex_replace:分离匹配组的访问索引

c++ - 找不到Boost库| C++

c++ - Boost::带有共享指针的侵入式列表

c++ - C++ 函数 WriteFile 和 ReadFile 中参数 LPVOID lpBuffer 使用什么变量类型

c++ - 不能用大括号传递两次指针

c++ - 如何在C++中跳到Ofstream对象的下一行

c++ - 如何从采用容器常量引用的函数返回非常量迭代器

c++ - 使用 std::function 包装非静态成员函数指针

c++ - 私有(private)嵌套类 c++ 的实例