C#异常体系:从SystemException到自定义异常
系统异常类型
.NET Framework 在 System 命名空间中定义了一系列系统异常类,这些异常通常由公共语言运行时(CLR)引发。常见的系统异常包括:
NullReferenceException:尝试操作空引用对象时引发ArgumentException:方法参数无效时抛出IndexOutOfRangeException:数组索引超出有效范围时触发InvalidOperationException:当对象状态不适合执行特定操作时发生2DivideByZeroException:数学运算中除以零导致的异常
系统异常继承自 System.SystemException 类,用于标识由 .NET 运行库引发的错误。例如,NullReferenceException 是 SystemException 的实例。
异常处理机制
C# 使用四个关键词构建异常处理:try、catch、finally 和 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; } }
异常处理最佳实践
-
按顺序捕获异常:在
catch块中按从派生程度最高到最低的顺序排列异常2 -
资源清理:使用
using语句或finally块确保资源被正确释放2 -
避免不必要的异常:对于可能发生但可预见的条件,优先采用条件检查而非异常处理2
-
异常类型选择:优先使用 .NET Framework 内置异常,仅在需要特殊处理逻辑时才创建自定义异常
-
状态还原:当因异常导致方法未完成时,应确保对象状态得到正确还原2
自定义异常的设计考量
创建自定义异常时应考虑以下因素:
- 异常类型不应过于具体,以免调用者难以恰当处理
- 当调用者需要对特定异常类型执行专门处理时,才考虑自定义异常
- 自定义异常可以封装多个专门的异常类型,提供更统一的异常处理接口
通过合理运用 C# 异常体系,开发者可以构建出更加稳定可靠的应用程序,同时提高代码的可读性和维护性
更多推荐



所有评论(0)