我正在开发一个系统,该系统旨在使用名为error_code
,error_condition
和error_category
的类 - 一个新的std方案:在C ++ 11中,altho目前我正在使用Boost实现。我已经读过Chris Kholkoff的series of articles三次了,我想我一般都懂得如何创建这些类。
我的问题是这个系统需要处理存在于各个DLL中的插件,并且插件可能会发出错误。我的原始设计是计划一个系统特定的错误类别,其中包含所有各种错误代码以及未真正映射到errno
值的特定错误条件的候选清单。这里的问题是,为了使DLL能够使用这些错误代码之一,它需要访问应用程序中error_category
的唯一实例。我现在通过从每个DLL导出一个SetErrorCategory()
函数来处理这个问题,这个函数有点工作但是有点蠢。
我看到的替代解决方案是每个DLL都有自己的错误类别和代码,如果需要,还有自己的条件;我怀疑这更像是为这个库功能所设想的。但是,我认为这需要主应用程序的错误方案中的比较函数,该错误方案知道插件的错误方案,并且可以检查应用程序的哪些条件与插件的错误相匹配。这似乎更容易出现一堆问题,尽管我还没有尝试过实现它。我猜我必须在所有实际逻辑的基础上从DLL导出整个错误方案。
当然,另一种方法是使用DLL中的数字错误代码并将它们填充到应用程序端的错误对象中。它具有插件简单的优点,但可能导致应用程序陷入困境(例如,从几个不同的插件中处理对象的函数需要注意每个错误的来源)。
所以我的具体问题是:你会使用哪三个选项,为什么?哪个显然不可行?当然,有没有一种更好的方式没有发生在我身上?
答案 0 :(得分:2)
我在处理这个问题时遇到的解决方案是使用预定义代码来解决问题和用户子代码选择以及特定类型错误的继承。使用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块捕获更具体的错误类型,同时让更多通用版本的异常传递给其他控制块。然后,用户可以自由使用父异常代码或指定他们自己的代码(parent = 100 - > child = 115)。如果用户只是想要一个IOError而不创建一个新的错误系列,他们可以毫无困难地使用默认的系列异常。我发现这为用户提供了灵活性,而不需要在不需要时对异常代码进行OCD跟踪。
然而,这绝不是最终解决方案,因为个人偏好在这里引导我的设计选择。我发现有太多的错误代码变得令人困惑,异常继承已经编码了这些信息。实际上,在我描述的系统中,很容易完全删除错误代码并且只依赖于异常继承,但是很多人更喜欢将代码分配给每个异常名称。
答案 1 :(得分:2)
我想出了另一种解决方案:创建一个仅包含我的error_category
实现的DLL,并从应用程序和每个插件DLL链接到它。这使他们可以访问全局类别对象,而无需将该对象从应用程序显式传递给DLL。