系统异常类型

.NET Framework 在 System 命名空间中定义了一系列系统异常类,这些异常通常由公共语言运行时(CLR)引发。常见的系统异常包括:

  • NullReferenceException:尝试操作空引用对象时引发
  • ArgumentException:方法参数无效时抛出
  • IndexOutOfRangeException:数组索引超出有效范围时触发
  • InvalidOperationException:当对象状态不适合执行特定操作时发生2
  • DivideByZeroException:数学运算中除以零导致的异常

系统异常继承自 System.SystemException 类,用于标识由 .NET 运行库引发的错误。例如,NullReferenceException 是 SystemException 的实例。

异常处理机制

C# 使用四个关键词构建异常处理:trycatchfinally 和 throw1。基本结构如下:


csharpCopy Code

try { // 可能发生异常的代码 } catch (ExceptionName e1) { // 处理错误代码 throw; // 继续向上抛出异常 } finally { // 无论是否发生异常都会执行的代码 }

自定义异常实现

当内置异常无法满足特定业务需求时,可以创建自定义异常类3。自定义异常应继承自 Exception 类或其子类。


csharpCopy Code

class MyCustomException : Exception { public MyCustomException(string message) : base(message) { } }

最佳实践建议自定义异常从 System.ApplicationException 派生,这样可以清晰地区分异常来源。例如在银行业务中:


csharpCopy Code

class BankAccount { private decimal balance = 0; public void Withdraw(decimal amount) { if (amount <= 0) { throw new InvalidAmountException("提款金额必须大于零。"); } if (amount > balance) { throw new InsufficientBalanceException("余额不足。"); } balance -= amount; } }

异常处理最佳实践

  1. 按顺序捕获异常‌:在 catch 块中按从派生程度最高到最低的顺序排列异常2

  2. 资源清理‌:使用 using 语句或 finally 块确保资源被正确释放2

  3. 避免不必要的异常‌:对于可能发生但可预见的条件,优先采用条件检查而非异常处理2

  4. 异常类型选择‌:优先使用 .NET Framework 内置异常,仅在需要特殊处理逻辑时才创建自定义异常

  5. 状态还原‌:当因异常导致方法未完成时,应确保对象状态得到正确还原2

自定义异常的设计考量

创建自定义异常时应考虑以下因素:

  • 异常类型不应过于具体,以免调用者难以恰当处理
  • 当调用者需要对特定异常类型执行专门处理时,才考虑自定义异常
  • 自定义异常可以封装多个专门的异常类型,提供更统一的异常处理接口

通过合理运用 C# 异常体系,开发者可以构建出更加稳定可靠的应用程序,同时提高代码的可读性和维护性

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐