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

C++中抛出LPCWSTR可被捕获,std::wstring不行?如何正确捕获?

异常捕获问题解答

为什么两种抛出行为的捕获结果不同?

C++异常捕获遵循严格类型匹配规则:只有抛出的异常类型与catch块声明的类型完全一致,或存在合法的隐式转换/继承关系时,才会触发对应的捕获逻辑。

  • 抛出L"This is my exception."时,这个宽字符串字面量的原生类型是const wchar_t[],会被自动隐式转换为LPCWSTR(本质是const wchar_t*),和catch (LPCWSTR e)的类型完全匹配,因此能被该捕获块处理。
  • 抛出std::wstring对象时,这是一个标准库定义的类类型,和LPCWSTR(指针类型)之间没有默认的隐式转换路径,所以catch (LPCWSTR e)无法匹配该异常,最终会进入兜底的catch (...)通用捕获块。

如何捕获std::wstring类型的异常?

需要声明对应std::wstring类型的catch块,推荐使用const引用捕获(既避免拷贝异常对象的开销,也能兼容该类的派生类异常)。修改后的代码如下:

void ThrowAnException()
{
    std::wstring exception = L"This is my exception.";
    throw(exception);
}

int main()
{
    try
    {
        ThrowAnException();
    }
    catch (LPCWSTR e) { MessageBoxW(nullptr, e, L"User Exception (LPCWSTR)", MB_OK | MB_ICONEXCLAMATION); }
    catch (const std::wstring& e) { MessageBoxW(nullptr, e.c_str(), L"User Exception (std::wstring)", MB_OK | MB_ICONEXCLAMATION); }
    catch (...) { MessageBoxA(nullptr, "No details available", "Unknown Exception", MB_OK | MB_ICONEXCLAMATION); }

    return 0;
}

捕获到std::wstring异常后,可以通过成员函数c_str()获取对应的LPCWSTR格式指针,用于MessageBoxW的调用。

内容的提问来源于stack exchange,提问作者Silentium Vetzo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 17:17:23