1. C# 自定义异常类设计规范
命名规则
- 自定义异常类的命名通常以 “Exception” 结尾,以便清楚表明这是一个异常类。例如,
UserNotFoundException
、InvalidOrderException
等。这样的命名方式有助于代码的可读性和维护性,开发人员能直观地识别出这是一个用于处理特定异常情况的类。
继承关系
- 自定义异常类应继承自
System.Exception
类或它的某个子类。一般情况下,直接继承自 System.Exception
类就足够了。但如果该异常属于特定类型,例如和应用程序逻辑相关的异常,也可继承自 System.ApplicationException
。例如:
public class CustomBusinessException : System.Exception
{
public CustomBusinessException() : base() { }
public CustomBusinessException(string message) : base(message) { }
public CustomBusinessException(string message, System.Exception innerException) : base(message, innerException) { }
}
2. 适用业务场景
- 场景描述:在一个电商系统中,订单处理过程涉及到复杂的业务逻辑。比如,当订单金额超过用户账户余额且不允许透支时,系统需要抛出一个特定的异常。系统内置异常(如
ArgumentException
、InvalidOperationException
等)不能准确描述这种业务规则违反的情况。此时,自定义异常就显得尤为合适。
- 优势:自定义异常能够清晰地传达业务规则违反的信息,让捕获异常的代码可以更准确地处理该特定情况,提高代码的可读性和可维护性。同时,它可以携带与业务相关的特定数据,方便后续处理。
3. 代码实现
// 自定义异常类
public class InsufficientFundsException : System.Exception
{
public decimal OrderAmount { get; set; }
public decimal UserBalance { get; set; }
public InsufficientFundsException() : base() { }
public InsufficientFundsException(string message) : base(message) { }
public InsufficientFundsException(string message, System.Exception innerException) : base(message, innerException) { }
public InsufficientFundsException(decimal orderAmount, decimal userBalance)
: base($"订单金额 {orderAmount} 超过用户余额 {userBalance},余额不足。")
{
OrderAmount = orderAmount;
UserBalance = userBalance;
}
}
// 使用自定义异常的业务逻辑
public class OrderProcessor
{
public void ProcessOrder(decimal orderAmount, decimal userBalance)
{
if (orderAmount > userBalance)
{
throw new InsufficientFundsException(orderAmount, userBalance);
}
// 其他正常订单处理逻辑
Console.WriteLine("订单处理成功");
}
}
// 测试代码
class Program
{
static void Main()
{
try
{
OrderProcessor processor = new OrderProcessor();
processor.ProcessOrder(100, 50);
}
catch (InsufficientFundsException ex)
{
Console.WriteLine($"捕获到异常: {ex.Message}");
Console.WriteLine($"订单金额: {ex.OrderAmount}");
Console.WriteLine($"用户余额: {ex.UserBalance}");
}
}
}