这是正常的how to throw普通Win32错误,会自动检索错误描述,而且效果非常好:
if (!SomeWinFunc()) {
throw std::system_error(GetLastError(),
std::system_category(),
"SomeWinFunc crashed badly");
}
但是,我不确定如何处理COM错误,这些错误会被idiomatically这样检查:
HRESULT hr = comObj->SomeFunc();
if (FAILED(hr)) {
throw std::system_error(hr, // <-- is it correct here?
std::system_category(),
"SomeFunc crashed right now");
}
将HRESULT
传递给system_error
是否正确,还是有另一种方法可以从COM函数中抛出异常?
答案 0 :(得分:3)
通常,我使用Microsoft标准_com_error
异常类型处理此问题,可以通过以下方式之一轻松引发该类型。
_com_util::CheckError(hr); // throws when FAILED(hr)
_com_issue_error(hr); // throws always
Win32错误可以转换为HRESULT
,如下所示:
hr = HRESULT_FROM_WIN32(GetLastError());
但是,这意味着您必须处理新的异常类型,这可能会有问题。要以纯粹的STL方式执行此操作,我认为您需要派生一个新的error_category
并使用它而不是system_category
。我会查看<system_error>
标题并复制system_category
的实现,根据HRESULT
的需要进行更新。
理想情况下,HRESULT
中的不同facility codes将由不同的error_category
实现提供服务 - 这样做可以非常有效地传达异常及其来源。但这很棘手,你可以通过一个com_category
来处理HRESULT
一般。