1

问题

假设你有一个 C++ 类。

假设您要将其构造函数和方法导出到 C。

假设您遵循了“为 C 消费包装 C++ 类 API”问题的解决方案给出的建议。

现在假设您的类构造函数可以抛出一个或多个异常,您希望在返回 C 世界之前在 C++ 端捕获这些异常,同时仍然让 C 用户有机会获取有关刚刚发生的错误的信息。

第一种方法

我可以检查是否MyClass_new()返回了一个 NULL 指针,然后使用函数检索库中发生的“最后一条错误消息”,但是当构造函数失败时,没有对象可以为错误检索提供正确的上下文,因此应该是一个全局变量用于保存最后一个错误,但这会破坏库的可重入性。

第二种方法

我能想到的另一种可能性,实际上是我想出的解决方案,是让类在构造函数本身内部捕获异常,将其转换为错误消息并将对象置于排序的“错误状态”。

每次之后

MyClass myObj = MyClass_new();

将执行以下检查

if (MyClass_isInErrorState(myObj))

并且将使用下一条语句检索错误消息

const char *error = MyClass_getLastError(myObj);

第三种方法

我能想到的另一种可能性是将指向给定大小的缓冲区的指针传递给每个可能失败的函数,该函数将被错误消息填满,但看起来很乱。

你会怎么做?是否有处理此类问题的事实上的标准方法?

4

1 回答 1

1

回答我自己的问题。

我想我会采用稍微修改的第二种方法。

构造函数将BOOL像所有其他可能失败的函数一样返回,并将接受一个MyClass *输出参数,即使在出错的情况下也将设置为一些有意义的值,以便MyClass_getLastError(myObj)可以使用。

这摆脱了额外的MyClass_isInErrorState()功能。

MyClass在 C 端将是一个不透明的指针,在 C++ 端将是一个指向结构的指针,该结构包含指向类对象的指针(可能为 NULL)和包含错误字符串的各种缓冲区。

于 2015-07-13T17:16:11.277 回答