MST

星途 面试题库

面试题:C#异常处理中的自定义异常及最佳实践

在C#项目中,什么时候需要自定义异常?请详细说明自定义异常类的创建步骤,并举例说明如何在代码中合理抛出和捕获自定义异常,同时谈谈在自定义异常处理中的一些最佳实践。
29.6万 热度难度
编程语言C#

知识考点

AI 面试

面试题答案

一键面试

何时需要自定义异常

  1. 特定业务逻辑错误:当框架或.NET 内置异常无法准确描述业务场景中的错误时,例如在电商系统中,库存不足但内置异常没有专门表示库存不足的情况,就需要自定义异常。
  2. 提高错误处理针对性:希望在特定模块或业务流程中能更精确地捕获和处理异常,通过自定义异常可以让代码逻辑更清晰,如在支付模块中自定义支付相关异常。

创建自定义异常类步骤

  1. 继承异常基类:通常继承自 System.Exception 类,如果希望该异常支持序列化(用于跨应用域或远程处理等场景),可以继承 System.ApplicationException 类。例如:
public class MyCustomException : System.Exception
{
    // 后续添加构造函数等
}
  1. 添加构造函数
    • 默认构造函数:提供默认构造函数,用于简单创建异常对象。
    • 带错误消息参数的构造函数:方便传递具体错误信息。
    • 带错误消息和内部异常参数的构造函数:用于包装内部异常,便于调试和追踪异常来源。
public class MyCustomException : System.Exception
{
    public MyCustomException() : base() { }
    public MyCustomException(string message) : base(message) { }
    public MyCustomException(string message, Exception innerException) : base(message, innerException) { }
}

代码中抛出和捕获自定义异常示例

  1. 抛出异常
public class ExampleClass
{
    public void CheckValue(int value)
    {
        if (value < 0)
        {
            throw new MyCustomException("值不能为负数");
        }
    }
}
  1. 捕获异常
class Program
{
    static void Main()
    {
        ExampleClass example = new ExampleClass();
        try
        {
            example.CheckValue(-1);
        }
        catch (MyCustomException ex)
        {
            Console.WriteLine($"捕获到自定义异常: {ex.Message}");
        }
    }
}

自定义异常处理最佳实践

  1. 命名规范:异常类名应该清晰地表达异常含义,通常以“Exception”结尾,如“InvalidOrderException”。
  2. 包含足够信息:在异常类中添加额外属性以提供更多错误上下文,如电商订单异常中添加订单号属性,方便定位问题。
  3. 合理抛出:避免过度抛出异常影响性能,只在真正错误且需要特殊处理的情况下抛出。
  4. 集中处理:在合适的层次(如应用程序的边界层、业务逻辑层与数据访问层的接口等)集中捕获和处理自定义异常,进行统一的日志记录、错误提示等操作。