Ale*_*x F 4 c++ api error-handling exception
我需要编写C++ API,它包含几个使用.lib文件(MSVC)从Dll公开的导出C++类.从我理解的另一个问题的答案来看,导出的类方法不能使用异常,如果C++ API是在一个VC++版本中构建的(比如2010),而客户端代码是用另一个VC++版本编写的.由于异常不能成为公共API接口的一部分,我正在寻找另一种错误处理策略.我的限制:我不想使用COM,而丰富的错误代码系统(如HRESULT)对我来说还不够.我希望有类似异常的类,其中包含错误代码,错误消息和我需要的任何其他信息.另外,我不想为每个VC++版本单独构建.
我目前的做法如下.每个公共类方法都返回枚举值(如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;
这看起来不太好.类接口很乱:每个函数现在都有ErrorCode返回类型.返回值成为输出参数.是否有更好的方法,允许达到错误信息,并保持干净的公共API接口?
您可能忽略了一个简单的解决方案.唯一的限制是异常不能跨越模块边界.客户端代码本身抛出异常没有问题.因此,在标题中提供内联函数,比如CheckReturn(),它会抛出丰富的异常.
有关灵感,请查看COM IErrorInfo接口及其关联的_com_error类.他们解决了完全相同的问题.还要注意MSVC中可用的#import指令,它会自动生成调用的小包装函数,并在失败返回值上抛出异常.但是你不想使用COM,因此不能直接使用.
| 归档时间: |
|
| 查看次数: |
3312 次 |
| 最近记录: |