尝试在C++生成器中捕获__finally使用
try catch __finally use in C++ Builder
我是否正确地认为这段代码:
try
{
Screen->Cursor = crHourGlass;
try
{
throw Exception("error!");
}
catch(Exception& e)
{
Application->MessageBox(UnicodeString(e.Message).c_str(), L"Error", MB_OK);
}
}
__finally
{
Screen->Cursor = crDefault;
}
实际上与此相同,并且__finally在这里没有任何用途,因为在这两种情况下,屏幕>光标 = crDefault 无论如何都会被执行?
Screen->Cursor = crHourGlass;
try
{
throw Exception("error!");
}
catch(Exception& e)
{
Application->MessageBox(UnicodeString(e.Message).c_str(), L"Error", MB_OK);
}
Screen->Cursor = crDefault;
否,因为您只捕获Exception
类型的异常。如果发生其他异常,则不会在第二个版本的代码中执行屏幕>光标 = crDefault。
回答您的问题 - 不,它们并不相同,因为如果发生意外情况,在第二个版本中跳过crDefault
作业的可能性很小。 第一个版本中的__finally
通常会处理这个问题。
话虽如此,另一种方法是使用 RAII 容器而不是 __finally
,例如:
class TUpdateScreenCursor
{
private:
TCursor m_Original;
public:
TUpdateScreenCursor(TCursor NewCursor)
{
m_Original = Screen->Cursor;
Screen->Cursor = NewCursor;
}
~TUpdateScreenCursor()
{
Screen->Cursor = m_Original;
}
};
{
TUpdateScreenCursor sc(crHourGlass);
try
{
throw Exception("error!");
}
catch (const Exception& e)
{
Application->MessageBox(e.Message.c_str(), _D("Error"), MB_OK);
}
}
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- C++:TypeDef使用元组
- 使用std::multimap迭代器创建std::list
- 从不同线程使用int64的不同字节安全吗
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么在全局范围内使用"extern int a"似乎不行?
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用Google Mock来模拟gettimeofday()
- 如何使用默认参数等选择模板专业化
- 为什么使用 "this" 指针调用派生成员函数?
- 使用新行和不使用新行读取文件
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 如何确定我已使用非编码文件到达 EOF?
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 使用CMake创建QML插件
- 使用strcpy将char数组的元素复制到另一个数组
- 在c++中使用nlohmann从类到json的转换
- 使用指针从C++中的数组中获取最大值
- 使用C++lambda正确实现finally块