【发布时间】:2016-05-20 19:22:18
【问题描述】:
我正在处理一个向用户请求文件、用户名和密码的对话框。我希望在用户的选择出现问题时通知用户。在我检查对话框的名称和密码字段之前,该文件必须有效。我知道还有其他方法可以做到这一点,我的问题是关于这个过程的效率。
我的 MFC C++ 应用程序有一个字符串表,其中使用将翻译单元映射到整数 (#define IDS_SOME_ERROR 100) 的宏来标识字符串,MFC 框架可以使用这些整数从字符串表中加载字符串.
我很好奇抛出原始类型的效率,所以我查看了cpprefrence.com 上的throw 关键字。
throw expression语句从表达式复制初始化异常对象(这可能会调用右值表达式的移动构造函数,并且复制/移动可能会受到复制省略),然后将控制权转移到匹配的异常处理程序其复合语句或成员初始值设定项列表是最近进入该执行线程但未退出的类型。即使复制初始化选择移动构造函数,从左值复制初始化也必须格式正确,并且析构函数必须是可访问的(C++14 起)。
这是 another question 询问要抛出的类型,我注意到一条评论说不要抛出 int 或 string 之类的东西。这是为什么呢?
这是我的代码:
void SomeDialog::OnOK()
{
UpdateData();
try
{
if (VerifySomeFile(myFileStruct.getPath()))
{
if (DialogNameField.IsEmpty())
{
throw IDS_ERROR_NOID; // "No name specified."
}
if (DialogPasswordField.IsEmpty())
{
throw IDS_ERROR_NOPWD; // "No password specified."
}
CDialog::OnOK();
}
else
{
throw IDS_BAD_FILE; // "Bad or expired file."
}
}
catch (int errIDS)
{
CString tempStr;
tempStr.LoadString(errIDS);
AfxMessageBox(tempStr, MB_OK);
}
}
既然int 是C++ 中的原始类型,那么throw 语句是否还必须执行任何复制?以这种方式在 C++ 中抛出原始类型是否安全?删除 catch 块并将我的错误对话框逻辑从 catch 块放置到每个抛出位置会更有效吗?如果我要这样做,我还必须嵌套我的代码,以便在出现多个错误时只显示一个对话框。
【问题讨论】:
-
“为什么会这样?” - 正如公认的答案所说:“不要抛出原始类型,因为它们不携带语义信息。”
-
@ChristianHackl,但就我而言,我不太担心异常包含的信息,而更多地担心控制流。我觉得有一个创建对话框的控制点比在我的更复杂的源代码中创建对话框更好。
标签: c++ exception exception-handling try-catch