MST
星途 面试题库

面试题:C#自定义异常类与异常处理最佳实践

请设计一个C#应用场景,其中需要自定义一个异常类`MyBusinessException`,继承自`Exception`。详细说明自定义异常类的属性和方法设计思路,以及在整个业务逻辑中如何抛出和捕获这个自定义异常,同时阐述这样做相对于使用系统内置异常类,在代码维护性、可读性以及错误处理的灵活性方面的优势。要求给出完整的代码示例以及对代码的详细解释。
25.7万 热度难度
编程语言C#

知识考点

AI 面试

面试题答案

一键面试

1. 自定义异常类设计思路

在C#中,自定义异常类通常继承自Exception类。MyBusinessException可以包含一些属性来提供更多关于异常的特定信息,比如错误代码、错误描述等。方法方面,除了继承自Exception类的构造函数,还可以根据需要添加自定义方法来辅助处理异常。

2. 代码示例

// 自定义异常类
public class MyBusinessException : Exception
{
    // 自定义属性,用于存储错误代码
    public int ErrorCode { get; set; }

    // 构造函数,接收错误信息和错误代码
    public MyBusinessException(string message, int errorCode) : base(message)
    {
        ErrorCode = errorCode;
    }

    // 重写ToString方法,提供更详细的异常信息
    public override string ToString()
    {
        return $"ErrorCode: {ErrorCode}, Message: {Message}";
    }
}

public class BusinessLogic
{
    // 模拟业务方法,可能会抛出自定义异常
    public void ProcessData(int value)
    {
        if (value < 0)
        {
            // 抛出自定义异常
            throw new MyBusinessException("Value cannot be negative", 1001);
        }
        Console.WriteLine($"Processed value: {value}");
    }
}

class Program
{
    static void Main()
    {
        BusinessLogic logic = new BusinessLogic();
        try
        {
            logic.ProcessData(-5);
        }
        catch (MyBusinessException ex)
        {
            // 捕获自定义异常并处理
            Console.WriteLine($"Caught MyBusinessException: {ex.ToString()}");
        }
    }
}

3. 代码解释

  • 自定义异常类MyBusinessException
    • 继承自Exception类,具备异常的基本功能。
    • ErrorCode属性用于存储特定业务错误代码。
    • 构造函数接收错误信息和错误代码,调用基类构造函数传递错误信息,并初始化ErrorCode
    • 重写ToString方法,返回包含错误代码和错误信息的详细字符串。
  • BusinessLogic
    • ProcessData方法模拟业务逻辑。当传入的值小于0时,抛出MyBusinessException异常,错误信息为“Value cannot be negative”,错误代码为1001。
  • Program
    • Main方法中创建BusinessLogic实例。
    • 使用try - catch块捕获MyBusinessException异常。如果捕获到异常,打印详细的异常信息。

4. 优势

  • 代码维护性:自定义异常类使得错误处理逻辑更集中,当业务需求变化时,只需在自定义异常类及其抛出和捕获处修改代码,而不会影响系统其他部分。
  • 可读性:自定义异常类名清晰地表明异常与业务相关,阅读代码的人能快速了解异常的性质和来源。例如MyBusinessException明确表示这是业务逻辑导致的异常。
  • 错误处理灵活性:通过添加自定义属性(如ErrorCode),可以提供更丰富的错误信息,在捕获异常时可以根据错误代码进行更细致的处理,而不仅仅依赖于通用的错误信息。