c++ - 孤立代码块在结构中抛出异常
问题描述
我最近在一次采访中被问到这个问题。在代码下方,询问了片段行为。我提到代码会抛出一个异常,该异常会被捕获,但事实证明它不是正确的答案。
我已经尝试调试这段代码片段并且有两个问题。
1. 如果执行确实进入该行 try { A a; 那么为什么catch 无法捕捉到异常呢?
2. 这段不属于结构内任何方法的孤儿代码的行为是什么?如果我将孤儿代码包含在 B 的构造方法下,即在 B() { } 中,则异常被正确捕获。那么执行流程是如何处理这个问题的呢?我的意思是B中的孤儿代码try catch属于哪个方法/函数堆栈?
#include<iostream>
#include<string>
using namespace std;
struct A
{
A()
{
throw 2;
}
};
struct B
{
B()
// start of orphan code.
try
{
A a;
}
catch(int i)
{
cout << i << endl;
}
// end of orphan code.
};
int main(int argc, char* argv[])
{
B b;
cout << "3" << endl;
return(0);
}
解决方案
您所说的“孤儿代码”实际上是一个函数 try block。当与构造函数和析构函数一起使用时,此类块具有特殊行为:每个catch
块都隐式地重新抛出异常,就好像最后一个语句是throw;
. 这样做是为了使无法使用未能完成构造的对象。
推荐阅读
- alpine.js - AlpineJS - 当有多个待办事项时,自动选择不起作用
- java - 使用 Stream API 打印集合中的唯一值
- javascript - 文本不会保留在边界内
- dynamics-crm - 如何在 Dynamics FetchXML 结果中将今天的日期显示为列?
- android - Android 动画 - 翻译和缩放无法正常工作
- node.js - 让 exec 等待上一个 exec
- azure - 使用 bitbucket 管道 yml 脚本将文件复制到 azure blob 存储
- php - 防止直接访问pdf文件?php、wordpress
- hibernate - Hibernate 乐观锁问题
- express - 使用 Vue.js 和 Express,js 进行授权