异常处理与栈展开(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(),程序继续运行、不崩溃