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

在 C# 中,如何定义自定义异常类?请说明创建自定义异常类的步骤,以及在代码中如何抛出和捕获这类异常?

考察说明

考查对 C# 异常处理机制中自定义异常类的理解,包括创建、抛出和捕获的完整流程。

回答思路

  1. 【回答框架 1】自定义异常类必须继承自 System.Exception 或其子类(如 ApplicationException)。通常建议继承 Exception 而非 ApplicationException,因为 ApplicationException 不再具有特殊语义。自定义异常类应包含无参构造函数、带消息的构造函数、带消息和内部异常的构造函数,以及用于序列化的构造函数(如果异常需要跨进程传递)。
  2. 【回答框架 2】创建自定义异常类时,需要定义构造函数,并为其提供有意义的属性来携带额外错误信息。例如,可以添加一个属性如 ErrorCode,用来在捕获时获取详细的错误信息。异常类名一般以 Exception 结尾,符合 .NET 命名规范。
  3. 【回答框架 3】使用自定义异常时,通过 throw 语句抛出,例如 throw new MyCustomException(\"错误信息\", innerException)。捕获时使用 try-catch 块,可以按需捕获特定类型,然后检查自定义属性以进行相应处理。
  4. 【回答框架 4】在捕获自定义异常时,需要注意异常过滤器的使用(catch when),可以根据异常属性转发到不同的处理逻辑。同时,应避免捕获所有异常后不处理,这可能导致问题掩盖。
  5. 【回答框架 5】自定义异常类对于业务逻辑的错误处理很有用,它可以将错误类型明确化,并提供丰富的上下文信息,便于上层调用者区分错误类型并采取相应措施。
  6. 【关键点 1】自定义异常类继承自 Exception,通常实现多个构造函数以支持标准用法。
  7. 【关键点 2】通过 throw 关键字抛出,try-catch 捕获,利用类型和属性区分错误。
  8. 【关键点 3】建议命名以 Exception 结尾,并在异常中保留 InnerException 以保持错误链条。
  9. 【易错点 1】不要随意继承 ApplicationException,因为该基类已无特殊语义,可能误导维护者。
  10. 【易错点 2】忽略 InnerException 导致原始错误信息丢失,应确保在构造函数中传递内部异常。
  11. 【易错点 3】捕获所有异常而不处理,以及过度使用异常进行流程控制,会降低代码可读性和性能。