执行投掷声明时会发生的例外情况
What will happen is an exception is thrown while executing a throw statement
我有以下代码段:
try
{
if(/*something is true*/)
{
throw Win32Error(msgWin32Error->GetError()); //assume msgWin32Error is NULL
}
}
catch (Win32Error& win32Error)
{
}
假设MSGWIN32ERROR在上述代码段中为null,则在执行抛出语句时,它将依次有另一个例外。在这种情况下,行为是什么?
谢谢su
这里没有C 例外。
您正在混淆两件事:
- C 异常(请参阅:
throw
,try
,catch
) - 操作系统调用的运行时错误(例如分段故障)
后者有时也被混乱地称为"异常",但是您无法用C catch
捕获这些。
会发生的是,msgWin32Error
的解除将(可能)导致操作系统终止您的应用程序。控制甚至永远不会达到您的throw
指令。
首先,当您放置空指针时,您会得到未定义的行为。抛出一个例外可能(因为引用UB的话,在允许行为的列表中抛出异常),但您不能指望这一点。但是,很容易构建一个定义明确的示例,该示例得到了我认为您的要求。
char const* foo()
{
throw ExceptionZ();
return "message";
}
void bar()
{
try
{
throw ExceptionX(foo());
}
catch(ExceptionX) { ... }
catch(ExceptionZ) { ... }
}
在这种情况下,将输入ExceptionZ
的处理程序。bar
中的投掷语句未完成。从 foo()
抛出的例外是在它传播之前。
相关文章:
- 模板方法访问正向声明的类仅在没有此指针的情况下无法编译
- 在没有标识符的情况下如何读取复杂的C++类型声明?
- 如何在不为其声明变量的情况下获取和使用常量值的地址?
- 为什么在这种情况下,前向声明不起作用?
- 如何在不混淆字段的情况下声明复数?
- 我们可以在没有新实例化的情况下声明一个抽象方法来返回抽象超类中的子类对象吗
- 在C++我可以在不在本地声明结构的情况下将结构作为指针传递吗?
- C++:如何在不定义的情况下声明非函数?
- 我需要在不使用前向声明的情况下相互包含两个头文件,导致"incomplete type"错误
- 在不使用默认构造函数的情况下声明 POD 结构时,会实例化什么?
- 有什么理由在没有继承的情况下声明一个虚拟方法
- 如何在不初始化常量的情况下声明数组?
- 如何在不包含 Windows.h 的情况下获取 IsDebuggerPresent 的声明
- 如何在不指定 C++ 中的所有参数的情况下声明程序的 main() 入口点
- 如何在不指定模板类型的情况下声明通用抽象类的对象
- 在C++中,如何在没有新元素且不单独声明单个元素的情况下创建"std::initializer_list<base *>"?
- 有没有办法在不引用其模板类型的情况下转发声明指向类的指针
- 在声明纯虚函数的父类的实例上调用纯虚函数时会发生什么情况
- 如何在不依赖#Define的情况下转发声明数组大小
- 当声明了虚拟析构函数但没有实现时会发生什么情况