请阐述 C# 的异常处理机制在运行时底层是如何实现的?
考察说明
考查对 C# 异常处理底层机制的理解,包括异常信息的记录与传播过程。
回答思路
- 【回答框架 1】C# 异常处理底层基于操作系统和运行时提供的结构化异常处理(SEH)机制,通过异常处理表记录 try 块、catch 块和 finally 块的元数据,包括异常类型、处理位置及范围。
- 【回答框架 2】抛出异常时,运行时将异常对象放入线程栈,并沿着调用栈向上搜索匹配的 catch 块,匹配依据是异常类型是否兼容(如派生类可被基类 catch 捕获),并在栈展开过程中执行 finally 块。
- 【回答框架 3】在 x64 平台上,栈展开通过 Windows 的 RtlUnwind 等函数实现,同时调用方保存和恢复寄存器,确保异常处理期间上下文正确。
- 【回答框架 4】性能上,异常抛出和捕获成本较高,尤其在频繁抛出时,会触发栈展开和异常对象分配,因此通常仅用于处理异常情况。
- 【关键点 1】底层依赖 SEH(结构化异常处理)机制。
- 【关键点 2】异常对象在堆上分配,沿调用栈传播。
- 【关键点 3】finally 块在栈展开过程中执行。
- 【关键点 4】类型匹配是 catch 选择的依据,派生类型可被基类捕获。
- 【关键点 5】异常处理有性能开销,应避免用于正常控制流。
- 【易错点 1】异常处理不保证完全捕获所有错误,例如栈溢出或内存不足可能无法正常处理。
- 【易错点 2】在 catch 中抛出新异常会丢失原始堆栈信息,除非使用内部异常。