何时需要自定义异常
- 特定业务逻辑错误:当框架或.NET 内置异常无法准确描述业务场景中的错误时,例如在电商系统中,库存不足但内置异常没有专门表示库存不足的情况,就需要自定义异常。
- 提高错误处理针对性:希望在特定模块或业务流程中能更精确地捕获和处理异常,通过自定义异常可以让代码逻辑更清晰,如在支付模块中自定义支付相关异常。
创建自定义异常类步骤
- 继承异常基类:通常继承自
System.Exception
类,如果希望该异常支持序列化(用于跨应用域或远程处理等场景),可以继承 System.ApplicationException
类。例如:
public class MyCustomException : System.Exception
{
// 后续添加构造函数等
}
- 添加构造函数:
- 默认构造函数:提供默认构造函数,用于简单创建异常对象。
- 带错误消息参数的构造函数:方便传递具体错误信息。
- 带错误消息和内部异常参数的构造函数:用于包装内部异常,便于调试和追踪异常来源。
public class MyCustomException : System.Exception
{
public MyCustomException() : base() { }
public MyCustomException(string message) : base(message) { }
public MyCustomException(string message, Exception innerException) : base(message, innerException) { }
}
代码中抛出和捕获自定义异常示例
- 抛出异常:
public class ExampleClass
{
public void CheckValue(int value)
{
if (value < 0)
{
throw new MyCustomException("值不能为负数");
}
}
}
- 捕获异常:
class Program
{
static void Main()
{
ExampleClass example = new ExampleClass();
try
{
example.CheckValue(-1);
}
catch (MyCustomException ex)
{
Console.WriteLine($"捕获到自定义异常: {ex.Message}");
}
}
}
自定义异常处理最佳实践
- 命名规范:异常类名应该清晰地表达异常含义,通常以“Exception”结尾,如“InvalidOrderException”。
- 包含足够信息:在异常类中添加额外属性以提供更多错误上下文,如电商订单异常中添加订单号属性,方便定位问题。
- 合理抛出:避免过度抛出异常影响性能,只在真正错误且需要特殊处理的情况下抛出。
- 集中处理:在合适的层次(如应用程序的边界层、业务逻辑层与数据访问层的接口等)集中捕获和处理自定义异常,进行统一的日志记录、错误提示等操作。