C++/WinRT异步方法如何抛出异常 现有写法catch块未触发问题求助
问题根源
- 第一点:
throw;是重新抛出已有异常的语法,仅允许在catch块或catch块调用的函数中使用。你在正常执行路径的try块内直接调用无参throw;属于未定义行为,这是你遇到执行逻辑异常、不进入catch块的直接原因。 - 第二点:当前异步协程返回值类型为
IAsyncOperation<bool>,但代码中没有编写任何co_return语句返回布尔值,也属于语法错误。
正确实现方式
C++/WinRT异步方法中抛出异常的规则很简单:直接抛出带具体异常对象的异常即可,C++/WinRT的协程框架会自动捕获你未处理的异常,存储到返回的异步操作对象中,等待调用方co_await该异步操作时,异常会自动在调用方上下文抛出。
如果你的需求是进入本地catch块打日志,直接抛具体异常对象即可,示例修正代码如下:
IAsyncOperation<bool> trythiswork() { bool contentFound{ false }; try { auto result = co_await someAsyncFunc(); if (result) { // 抛出具体的异常对象,比如C++/WinRT提供的hresult_error,也可以抛标准库异常 throw winrt::hresult_error(E_FAIL, L"自定义错误描述"); // 下面的语句不会被执行 contentFound = true; } } catch (...) { LOG_CAUGHT_EXCEPTION(); // 如果需要异常继续向上传递给调用方,这里可以再用无参throw;重新抛出 // throw; } co_return contentFound; }
额外注意点
如果你希望异常不被本地catch块消化、继续传递给异步方法的调用方,只需要在本地catch块处理完日志逻辑后,调用无参throw;重新抛出即可,这时候的无参throw;是在catch块内调用的,符合语法规则。
内容的提问来源于stack exchange,提问作者rsp
相关产品推荐
相关产品推荐

