【发布时间】: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