C#面试题更新 2026-08-05

请阐述 C# 中的异常处理机制,并说明如何应用 try-catch 块来捕获和处理异常。

编码实现技术原理C#.NET

考察说明

考察对 C# 异常处理模型的理解以及 try-catch 实际应用能力。

回答思路

  1. 【回答框架 1】C# 异常处理基于异常对象和托管运行时,发生错误时抛出继承自 System.Exception 的实例,CLR 沿调用栈向上搜索匹配的 catch 块。try 块包含可能出错的代码,catch 块捕获并处理特定或所有异常,finally 块无论是否抛出异常都会执行,用于资源清理。
  2. 【回答框架 2】使用 try-catch 时,可以在 try 后接一个或多个 catch,每个 catch 块指定异常类型,按顺序匹配,建议先捕获具体异常再捕获基类异常如 Exception。catch 块中可访问异常对象获取消息和堆栈信息,处理逻辑应记录日志并按需恢复或重新抛出。
  3. 【回答框架 3】可以省略 catch 只使用 try-finally 以确保清理,也可用 using 语句或 using 声明简化资源管理,它们会隐式生成 try-finally。在 .NET 中应避免使用 catch-all 忽略异常,可能掩盖问题;重新抛出时使用 throw 保留原始堆栈,避免 throw ex。
  4. 【回答框架 4】设计自定义异常时继承 ApplicationException 或 Exception,使用合理命名并以 Exception 结尾,提供多个构造函数方便调用方使用。异常应仅在真正异常时抛出,不要用于控制流程。
  5. 【关键点 1】异常对象继承自 System.Exception,CLR 沿调用栈查找匹配 catch 块。
  6. 【关键点 2】try-catch 支持多个 catch 按顺序匹配,先具体后基类。
  7. 【关键点 3】finally 用于资源清理,using 语句简化处理。
  8. 【关键点 4】避免吞没异常或 throw ex 丢失堆栈。
  9. 【关键点 5】自定义异常命名以 Exception 结尾并实现常用构造函数。
  10. 【易错点 1】使用 catch-all 捕获所有异常并忽略,可能掩盖错误导致状态不一致。
  11. 【易错点 2】使用 throw ex 会重置堆栈跟踪,应为 throw。
  12. 【易错点 3】将异常用于控制流,影响性能和可读性。