我需要编写C++ API,它由从DLL的暴露几个出口的C++类,使用.lib文件(MSVC)。从我的另一个问题的答案我明白,导出的类方法不能使用异常,如果C++ API内置在一个VC++版本(比如说2010),并且客户端代码写入另一个VC++版本。由于异常不能成为公共API接口的一部分,我正在寻找另一个错误处理策略。我的限制:我不想使用COM,而丰富的错误代码系统(如HRESULT)对我来说还不够。我想拥有包含错误代码,错误消息和我需要的任何其他信息的异常类。另外,我不想为每个VC++版本单独构建。C++ API设计和错误处理
我目前的做法如下。每个公共类方法都返回枚举值(如ErrorCode)。在该方法失败的情况下,像GetLastErrorInfo这样的静态函数将返回指向C++类的指针(假设ErrorInfo),该指针包含覆盖范围错误信息。 ErrorInfo保留为线程特定数据,并包含当前线程中最后一次调用的错误信息。如果最后一次API调用成功,则GetErrorInfo返回NULL。
考虑以下代码有例外:
try { classPtr->DoSomething(); cout << classPtr->GetData() << endl; } catch(const MyException& ex) { cout << ex.GetErrorMessage() << endl; return; }
没有例外,它看起来像这样:
ErrorCode result; int data; result = classPtr->DoSomething(); if (result != Success) { cout << MyClass::GetLastErrorInfo()->GetErrorMessage() << endl; return; } result = classPtr->GetData(data); if (result != Success) { cout << MyClass::GetLastErrorInfo()->GetErrorMessage() << endl; return; } cout << data << endl;
这看起来并不好。 Class接口很麻烦:现在每个函数都有ErrorCode返回类型。返回值成为输出参数。是否有更好的方法,允许达到错误信息,并保持清洁的公共API接口?
你可以使用boost :: tuple来获得多个返回类型并避免整个输出参数。但这只是真正的问题的破解 – Lalaland 2012-01-29 15:18:02
也如何创建内联包装函数来解释错误代码并抛出异常。我可以想到两种方法来做到这一点。 1.客户端包装(myFunction)。 2.客户端执行myFunction,并且myFunction是封装(internalMyFunction)。使用元组和模板元编程通过包装器传递其他返回类型。 – Lalaland 2012-01-29 15:21:31
可能的解决方案是在内部保留最后的错误,每种方法都会更新它。因此,类方法不需要返回错误。还有一种方法可以访问最后一个错误代码。当然,在多线程访问的情况下,解决方案会更复杂 – Eugene 2012-01-29 15:47:04