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
相关产品推荐
相关产品推荐

