MST

星途 面试题库

面试题:C# 自定义异常类的设计规范及应用场景

请详细阐述C#自定义异常类的设计规范,包括命名规则、继承关系等。并举例说明在何种业务场景下,自定义异常会比使用系统内置异常更合适,同时给出该场景下自定义异常类的代码实现。
12.5万 热度难度
编程语言C#

知识考点

AI 面试

面试题答案

一键面试

1. C# 自定义异常类设计规范

命名规则

  • 自定义异常类的命名通常以 “Exception” 结尾,以便清楚表明这是一个异常类。例如,UserNotFoundExceptionInvalidOrderException 等。这样的命名方式有助于代码的可读性和维护性,开发人员能直观地识别出这是一个用于处理特定异常情况的类。

继承关系

  • 自定义异常类应继承自 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. 适用业务场景

  • 场景描述:在一个电商系统中,订单处理过程涉及到复杂的业务逻辑。比如,当订单金额超过用户账户余额且不允许透支时,系统需要抛出一个特定的异常。系统内置异常(如 ArgumentExceptionInvalidOperationException 等)不能准确描述这种业务规则违反的情况。此时,自定义异常就显得尤为合适。
  • 优势:自定义异常能够清晰地传达业务规则违反的信息,让捕获异常的代码可以更准确地处理该特定情况,提高代码的可读性和可维护性。同时,它可以携带与业务相关的特定数据,方便后续处理。

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}");
        }
    }
}