请解释在 C# 编程语言中,开发者通常如何创建和使用自定义异常类,并说明其基本步骤和关键设计要点。
考察说明
考查对 C# 异常处理机制的理解以及自定义异常类的实现规范。
回答思路
- 【回答框架 1】自定义异常类应继承自 System.Exception 或它的某个子类(如 ApplicationException 已不推荐),通过添加必要的构造函数来支持不同的初始化方式,包括无参、带消息、带消息和内部异常等。
- 【回答框架 2】设计自定义异常时,应提供有意义的名称,通常以 Exception 结尾,并确保序列化支持(通过 [Serializable] 特性),特别是当异常可能跨域或跨进程传递时。
- 【回答框架 3】抛出自定义异常使用 throw 关键字,并可在构造函数中设置自定义属性以携带更多错误上下文,同时应避免在异常中暴露敏感堆栈或内部细节。
- 【回答框架 4】捕获自定义异常时,应按最具体到最一般的顺序排列 catch 块,并确保在 finally 中释放非托管资源,以避免资源泄漏。
- 【关键点 1】自定义异常必须继承 Exception 或其派生类,并建议实现多个构造函数以便灵活创建。
- 【关键点 2】异常类的命名通常以 Exception 结尾,以符合 .NET 约定。
- 【关键点 3】在可能远程传递异常时,应实现序列化构造函数以确保正确传输。
- 【关键点 4】抛出异常时使用 throw,在内部重新抛出时使用 throw; 以保留原始堆栈。
- 【易错点 1】不要从 ApplicationException 派生自定义异常,因为该基类已被弃用且不提供额外价值。
- 【易错点 2】在 catch 块中吞掉异常而不记录或重新抛出可能导致问题难以排查。
- 【易错点 3】自定义异常不应包含仅为了携带展示用的字符串而忽略结构化错误数据。