【发布时间】:2019-09-14 23:04:14
【问题描述】:
在将常规 C++ 类移植到 Windows 运行时类时,我遇到了相当大的障碍。我的 C++ 类通过抛出自定义错误对象来报告某些错误情况。这允许客户端方便地过滤异常,记录在公共界面中。
我似乎找不到一种可靠的方法来通过 ABI 传递足够的信息以使用 Windows 运行时复制相同的保真度1。假设HRESULT 是唯一的通用错误报告信息,我评估了以下选项:
- “显而易见”的选择:将异常条件映射到任何预定义的HRESULT values。虽然这在技术上可行(推测),但调用站点无法区分源自实现的错误和源自实现的被调用者的错误。
- 发明自定义
HRESULTs。如果this layout 仍然适用于 Windows 运行时,我可以轻松设置 Customer 位并疯狂地使用 my 27 位的错误代码表示。这有效,直到其他人也这样做。我不知道有任何方法可以将HRESULT归因于接口,这可以解决这种歧义。 - 即使上述任何一项都可以按预期工作,按照规定抛出hresult_errors,调用站点仍将受语言投影的支配。虽然 C# 似乎允许跨 ABI 传递任何
System.Exception(-derived) 错误对象,并在调用站点重新抛出它们,但 C++/WinRT 仅支持大约 14 种不同的异常类型(请参阅 throw_hresult)。李>
这些选项都不允许通过 ABI 获得足够完整的错误信息,看来HRESULT 可能还不够。 Windows 运行时是否有任何配置以允许其他(任意)错误信息通过 ABI?
1我对传递实际的 C++ 异常并不十分感兴趣。相反,我正在寻找一种方法,让客户能够以自然的方式唯一识别记录在案的错误情况。传递自定义 Windows 运行时错误类型会很好。
【问题讨论】:
-
听起来
RoOriginateError就是您要找的。您可以为您的错误存储一个自定义字符串,收到错误 hresult 的调用者可以通过GetRestrictedErrorInfo调用检索它。这就是异常文本在 C# 中的显示方式,即使从 C++/CX 抛出异常也是如此。
标签: error-handling windows-runtime c++-winrt