You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 17:48:06