关于C ++的一些问题尝试捕获
some problems about c++ try catch
我有一个关于尝试捕获机制的问题。 像代码一样:
global value default 0;
int thread1()
{
try
{
set global value to 1;
if exception happens
{
jump into catch;
}
set global value to 0;
}
catch
{
......
}
}
int thread2()
{
ASSERT(global value = 0);
}
如果我有如图所示的假代码,在 try 块中我将全局值设置为 1,然后发生异常,在线程 2 中我有一个 ASSERT 来测试此全局值是否等于 0,则 thread2 将显式失败,因为在线程 1 中,我们跳入 catch 块因为异常。那么谁能给我一些解释?我不知道尝试--catch如何防止这种情况。
例外情况是残酷地破坏了正常的执行流程。纠错流程是找到与抛出的对象对应的捕获;这可能会导致多次函数调用反向遍历。这就是为什么需要小心使用它们的原因,您有两个执行流程:正常执行流程和错误执行流程。
如果抛出的异常被紧随其后的 catch 块捕获,那么您只需要在 catch-block 中将变量设置为 0。
它不是,一个好的解决方案是 RAII(如评论中所建议的)。RAII是一个非常简单的想法。如您所知,当控件离开块时,在任何块入口处在堆栈上创建的每个对象都会被销毁,这个想法是构建一个封装某些东西的对象,以便无论发生什么,都会调用析构函数:
class GlobalControl {
public:
GlobalControl() { myglob = 1; } // RAII
~GlobalControl() { myglob = 0; } // RRID
};
... // somewhere else
try {
GlobalControl c; // ctor call init glob to 1
...
} // whatever will happens, leaving this block cause a call to dtor of c
catch (...) {
}
RAII 代表资源获取是初始化,这里的资源获取是将全局设置为 1,这是在对象的初始化部分进行的。RAII 应该称为 RAIIRRID,RAII + 资源释放是破坏(资源释放是将全局设置为 0,这是在析构函数中进行的)。
相关文章:
- 一个关于在C++中重载布尔运算符的问题
- 关于简单C++函数(is_palindrome)的逻辑的问题
- 关于 c++ 函数中指针赋值的简单问题
- C++ 关于指针取消引用的技术问题
- 关于复制构造函数的一个棘手问题
- 关于条件块的问题与&&运算符有关
- 关于如何使用指向主窗口的指针的 QT 问题
- 关于比较两个无序数组并删除 a[] 中可以在 b[] 中找到的元素的问题
- C++关于ENUM的问题。我得到的响应比枚举列表大
- 我的问题是关于C++中数字和序列的重复以及如何打印它们?
- 我关于函数"Assert"的C++代码有问题
- C++:关于使用 Stroustrup 示例移动构造函数/赋值的问题
- 关于 std::bitset 构造函数的几个问题?
- 关于仅正确使用二传手和变量的问题
- 关于Stroustrup C++书的自动和{}列表问题
- C++ 关于 Arduino - 一般问题
- C++ 关于两个类构造函数的问题
- 关于效率的问题
- 有效的问题 - 关于本地变量和全局变量,必须是基本的C/C 问题
- 这段代码有什么问题.关于STRNCAT