异常处理与栈展开(stack unwinding)
throw 抛出异常 → 沿调用栈向上逐层退出、撤销局部对象 → 被匹配的 catch 捕获
调用栈(栈帧自下而上压入)
main()
try { process(a,b); }
catch(DivByZero e){ … }
process(a,b)
r = Div(a,b);
局部对象:Logger log;
Div(x,y)
if(y==0)
throw DivByZero();
y = 0
⇡ 退出 · 撤销局部对象
⇡ 无匹配 catch · 退栈 · log 析构
✓ 类型匹配 · 在此捕获
栈展开 · 沿调用链向上
控制流:从深层 throw 跳到 catch
异常对象
DivByZero e
what(): "divide by zero"
catch(DivByZero e)
打印 e.what(),程序继续运行、不崩溃
▶ 重播