编辑
2025-09-21
C#
00

目录

自定义异常类的应用特点
自定义异常类的使用场景
业务逻辑异常
自定义异常类的定义规范
自定义异常类的最佳实践
总结

在C#编程中,异常处理是确保程序稳健性和可靠性的重要手段。虽然C#提供了丰富的内置异常类型,但在实际开发中,我们常常需要根据具体的业务逻辑创建自定义异常类,以提供更有意义的错误信息,方便调试和维护。本文将深入探讨C#中的自定义异常类,了解其应用特点,探讨其在不同场景下的应用,并通过多个示例展示如何在实际编程中有效使用自定义异常类。

自定义异常类的应用特点

  1. 提供特定的错误信息:自定义异常类可以携带与特定错误相关的信息,包括错误原因、发生位置等,帮助开发者快速定位问题。
  2. 精细化异常处理:通过定义不同的异常类型,程序可以对不同的异常情况进行精确的捕获和处理,提升代码的可读性和可维护性。
  3. 扩展性:自定义异常类可以根据需求添加新的属性和方法,以满足不同的异常处理需求。

自定义异常类的使用场景

业务逻辑异常

在业务逻辑处理中,可能会出现一些特定的异常情况。例如,订单数量为负数、用户名重复等。通过自定义异常类,可以清晰地表示这些异常,便于调用者进行针对性的处理。

示例:订单数量异常

C#
namespace App01 { // 自定义异常类 public class OrderQuantityException : Exception { public int InvalidQuantity { get; set; } public OrderQuantityException() { } public OrderQuantityException(string message) : base(message) { } public OrderQuantityException(string message, int quantity) : base(message) { InvalidQuantity = quantity; } public OrderQuantityException(string message, Exception innerException) : base(message, innerException) { } } internal class Program { static void Main(string[] args) { try { CheckOrderQuantity(-5); } catch (OrderQuantityException ex) { Console.WriteLine($"捕获到异常:{ex.Message}"); Console.WriteLine($"非法的订单数量:{ex.InvalidQuantity}"); } } // 检查订单数量的方法 private static void CheckOrderQuantity(int quantity) { if (quantity < 0) { throw new OrderQuantityException("订单数量不能为负数。", quantity); } else if (quantity == 0) { throw new OrderQuantityException("订单数量不能为零。", quantity); } // 继续处理订单 } } }

image.png

自定义异常类的定义规范

  1. 继承自**Exception**或其子类:自定义异常类应直接或间接继承自System.Exception类,以便于异常机制的正常运作。
  2. 实现序列化支持:为了支持跨应用程序域或进程边界传递异常对象,应实现序列化机制。
  3. 提供必要的构造函数:通常应提供无参数构造函数、仅带错误信息的构造函数、带错误信息和内部异常的构造函数,以及序列化构造函数。

完整示例:

C#
[Serializable] public class CustomException : Exception { public string AdditionalInfo { get; set; } public CustomException() { } public CustomException(string message) : base(message) { } public CustomException(string message, string additionalInfo) : base(message) { AdditionalInfo = additionalInfo; } public CustomException(string message, Exception innerException) : base(message, innerException) { } protected CustomException(SerializationInfo info, StreamingContext context) : base(info, context) { AdditionalInfo = info.GetString("AdditionalInfo"); } // 重写GetObjectData方法,支持序列化 public override void GetObjectData(SerializationInfo info, StreamingContext context) { info.AddValue("AdditionalInfo", AdditionalInfo); base.GetObjectData(info, context); } }

image.png

自定义异常类的最佳实践

  1. 只在必要时创建自定义异常类:避免过度创建异常类,确保每个自定义异常类都具有明确的意义和用途。
  2. 提供有用的错误信息:在异常信息中包含有助于调试和处理的问题描述。
  3. 遵循命名规范:异常类的命名应以“Exception”结尾,名称应清晰表明异常的含义。
  4. 使用异常捕获的层次结构:在捕获异常时,按照从具体到抽象的顺序进行捕获,先捕获自定义异常,再捕获更通用的异常类型。

示例:异常捕获层次结构

C#
try { // 可能抛出异常的代码 } catch (OrderQuantityException ex) { // 处理订单数量异常 } catch (DataAccessException ex) { // 处理数据访问异常 } catch (Exception ex) { // 处理其他异常 }

总结

在本文中,我们深入探讨了C#中的自定义异常类,了解了其应用特点和适用场景,并通过详细的示例展示了如何定义和使用自定义异常类。自定义异常类是提升程序健壮性和可维护性的有力工具,合理使用可以为程序提供更丰富的错误信息,方便调试和异常处理。

在实际开发中,应根据具体的业务需求和异常处理需求,合理地设计和使用自定义异常类,遵循编码规范和最佳实践,从而编写出高质量的代码。

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!