我正在尝试创建此消息框,但框中的文本是一种奇怪的语言。
catch (const ExceptionHandling& e)
{
// initialize vars
const wchar_t* wideWhat = nullptr;
const wchar_t* wideType = nullptr;
size_t size;
mbstowcs_s(&size, nullptr, 0, e.what(), 0);
if (size != static_cast<size_t>(-1))
{
std::wstring wideString(size + 1, L'\0');
size_t convertedSize;
mbstowcs_s(&convertedSize, &wideString[0], size + 1, e.what(), size);
// save wideWhat
wideWhat = wideString.c_str();
}
size_t size2;
mbstowcs_s(&size2, nullptr, 0, e.GetType(), 0);
if (size2 != static_cast<size_t>(-1))
{
std::wstring wideString(size2 + 1, L'\0');
size_t convertedSize;
mbstowcs_s(&convertedSize, &wideString[0], size2 + 1, e.GetType(), size2);
// save wideType
wideType = wideString.c_str();
}
// send MessageBox
MessageBox(nullptr, wideWhat, wideType, MB_OK | MB_ICONEXCLAMATION);
}
catch (const std::exception& e)
{
size_t size;
mbstowcs_s(&size, nullptr, 0, e.what(), 0);
if (size != static_cast<size_t>(-1))
{
std::wstring wideString(size + 1, L'\0');
size_t convertedSize;
mbstowcs_s(&convertedSize, &wideString[0], size + 1, e.what(), size);
MessageBox(nullptr, wideString.c_str(), L"Standard Exception", MB_OK | MB_ICONEXCLAMATION);
}
}
catch (...)
{
MessageBox(nullptr, L"No details available", L"Unknown Exception", MB_OK | MB_ICONEXCLAMATION);
}
return -1;
这是捕获异常的代码部分。然而,消息框需要我一个 LPCWSTR 参数,我尝试转换 e.what() 和 e.GetType() 的返回值,但消息框已损坏。
我尝试将 e.what() 和 e.GetType() 转换为 LPCWSTR,我希望消息框以英语显示,但它似乎已损坏。 我还期望使用更小的代码进行转换。
我知道这个答案并不能真正回答你关于为什么代码不起作用的问题,但我希望它仍然对你有用。
捕获异常的代码不应该显示消息框——它应该做的是记录错误,如果所述错误是不可恢复的,那么它应该终止程序。它应该避免任何进一步复杂的操作,例如显示对话框、分配内存等。
如果由于程序内存不足而捕获
std::bad_alloc
异常,然后尝试分配缓冲区来转换和/或格式化错误消息,该怎么办?
如果您的代码从您调用的某些 Windows API 中收到错误 87 (ERROR_INVALID_PARAMETER),然后抛出
std::invalid_argument
,该怎么办?当了解哪个参数无效的唯一方法是在 API 调用之前记录所有参数并事后调查日志时,用户将如何处理异常消息?
消息框应该只向用户显示有意义且可操作的错误消息。例如,“您无权访问
C:\Windows\System32\Drivers\etc\hosts
文件。您必须以管理员身份运行该程序”是一条有意义且可操作的消息,但“访问被拒绝”。不是因为它没有告诉用户他们被拒绝访问的内容、原因以及如何解决。
最后,在深入研究异常处理、字符转换和 Windows 等高级概念之前,您应该真正学习如何将通用代码提取到函数中并向其传递参数,而不是像示例中那样将几乎相同的代码复制/粘贴三次API。