如何从FAILED(HRESULT)抛出std :: system_error异常?

时间:2017-12-06 21:39:19

标签: c++ winapi exception com throw

这是正常的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函数中抛出异常?

1 个答案:

答案 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一般。