【问题标题】:What is the recommended way to report errors from custom WinRT component?从自定义 WinRT 组件报告错误的推荐方法是什么?
【发布时间】:2019-05-23 05:08:08
【问题描述】:

我正在创作一个供第三方使用的自定义 C++ WinRT 组件库。我无法确定从我的库中报告/传播运行时错误条件的“最佳做法”是什么。

我发现这篇文章详细介绍了通过 HRESULT 处理异常和跨越 WinRT ABI 的最佳实践:https://docs.microsoft.com/en-us/windows/uwp/cpp-and-winrt-apis/error-handling

但是我不清楚如何处理自定义(异常)错误。我想遵循现代 c++ 实践并抛出 std::runtime_errors,但 WinRT 文档说这是保留用于将标准库错误映射到“E_FAIL”HRESULT。我是否应该遵循 COM 模型并实现自定义 HRESULT 值,只是为了扔掉它们?

【问题讨论】:

  • 推荐的报告可恢复错误的方法不是抛出异常,而是以 API 内的方式报告错误,例如,通过返回 Status 枚举。对 Windows 运行时对象的建议是只为不可恢复的错误引发异常,并且您调用 RoOriginateError 并带有说明问题所在的描述性消息。由于异常是不可恢复的,所以抛出什么异常并不重要——无论哪种方式都会使应用程序崩溃。 (在您链接的页面中,阅读以“不要抛出您期望捕获的异常”开头的段落。)
  • 嗨,雷蒙德——谢谢。关于捕获的指导在这里很清楚,但在编写运行时组件供其他人使用的上下文中感觉有点模糊。在某些情况下,很难判断第三方是否应该将给定的错误视为异常。我听到的是最好总是倾向于错误传递,并为明显不可恢复和/或编程错误的情况保留例外。
  • 是的,这就是指导。我会看看我能做些什么来澄清文档。谢谢你叫出来。
  • 当然——但不确定这是否是文档中的差异。我对异常的基础知识也比较陌生,比如何时以及何时不抛出。

标签: uwp windows-runtime c++-winrt


【解决方案1】:

只需抛出一个winrt::hresult_error,带有 hresult 代码和错误消息。你也可以抛出一个继承自它的异常。 cppwinrt 生成的代码会将您的异常转换为 HRESULT。

【讨论】:

  • 这是我一直倾向于的。我想这意味着我要么需要“劫持”一些与问题足够接近的现有 HRESULT,抛出一个通用的 E_FAIL,要么实现我自己的一组 HRESULT 值。
  • 这里是微软定义的所有HRESULT 值。我想你会找到一个足够近的。如果你想实现自己的集合,记得遵守rules
猜你喜欢
  • 2014-02-21
  • 2017-04-20
  • 1970-01-01
  • 1970-01-01
  • 2011-07-07
  • 2018-04-12
  • 1970-01-01
  • 2015-11-14
  • 1970-01-01
相关资源
最近更新 更多