包装 C++ 类 API 以供 C 使用时如何将异常转换为错误和错误消息?
How to convert exceptions to errors and error messages when wrapping C++ classes API for C consumption?
问题
假设你有一个 C++ class。
假设您想将其构造函数和方法导出到 C。
假设您遵循了 solution to the "Wrapping C++ class API for C consumption" 问题中给出的建议。
现在假设您的 class 构造函数可以抛出一个或多个异常,您希望在返回 C 世界之前在 C++ 端捕获这些异常,同时仍然让 C 用户有机会获得有关刚刚发生的错误。
第一种方法
我可以检查 MyClass_new()
是否返回了 NULL 指针,然后使用函数检索库中出现的 "last error message",但是当构造函数失败时,没有对象可以为它提供正确的上下文错误检索,因此应该使用一个全局变量来保存最后一个错误,但这会破坏库的可重入性。
第二种方法
我能想到的另一种可能性,这实际上是我想出的解决方案,是 class 将异常捕获到构造函数本身内部,转换将其添加到一条错误消息中,并将对象放入 "error state" 排序中。
每个
之后
MyClass myObj = MyClass_new();
将执行以下检查
if (MyClass_isInErrorState(myObj))
错误消息将在下一个语句中检索
const char *error = MyClass_getLastError(myObj);
第三种方法
我能想到的另一种可能性是将指向给定大小的缓冲区的指针传递给每个可能失败的函数,这将被错误消息填满,但看起来很乱。
你会怎么做?是否有处理此类问题的事实上的标准方法?
回答我自己的问题。
我想我会采用稍微修改的第二种方法。
构造函数将 return BOOL
像所有其他可能失败的函数一样,并将接受一个 MyClass *
out 参数,即使在出现错误的情况下,该参数也会被设置为一些有意义的值, 这样 MyClass_getLastError(myObj)
就可以使用了。
这摆脱了额外的 MyClass_isInErrorState()
功能。
MyClass
在 C 端将是一个不透明的指针,在 C++ 端将是一个指向结构的指针,该结构包含指向 class' 对象和缓冲区的指针,可能为 NULL包含错误字符串的种类。
问题
假设你有一个 C++ class。
假设您想将其构造函数和方法导出到 C。
假设您遵循了 solution to the "Wrapping C++ class API for C consumption" 问题中给出的建议。
现在假设您的 class 构造函数可以抛出一个或多个异常,您希望在返回 C 世界之前在 C++ 端捕获这些异常,同时仍然让 C 用户有机会获得有关刚刚发生的错误。
第一种方法
我可以检查 MyClass_new()
是否返回了 NULL 指针,然后使用函数检索库中出现的 "last error message",但是当构造函数失败时,没有对象可以为它提供正确的上下文错误检索,因此应该使用一个全局变量来保存最后一个错误,但这会破坏库的可重入性。
第二种方法
我能想到的另一种可能性,这实际上是我想出的解决方案,是 class 将异常捕获到构造函数本身内部,转换将其添加到一条错误消息中,并将对象放入 "error state" 排序中。
每个
之后MyClass myObj = MyClass_new();
将执行以下检查
if (MyClass_isInErrorState(myObj))
错误消息将在下一个语句中检索
const char *error = MyClass_getLastError(myObj);
第三种方法
我能想到的另一种可能性是将指向给定大小的缓冲区的指针传递给每个可能失败的函数,这将被错误消息填满,但看起来很乱。
你会怎么做?是否有处理此类问题的事实上的标准方法?
回答我自己的问题。
我想我会采用稍微修改的第二种方法。
构造函数将 return BOOL
像所有其他可能失败的函数一样,并将接受一个 MyClass *
out 参数,即使在出现错误的情况下,该参数也会被设置为一些有意义的值, 这样 MyClass_getLastError(myObj)
就可以使用了。
这摆脱了额外的 MyClass_isInErrorState()
功能。
MyClass
在 C 端将是一个不透明的指针,在 C++ 端将是一个指向结构的指针,该结构包含指向 class' 对象和缓冲区的指针,可能为 NULL包含错误字符串的种类。