C Sharp 异常概述
外观
C#异常概述[编辑 | 编辑源代码]
异常(Exception)是C#编程中用于处理程序运行时错误的一种机制。当程序执行过程中遇到意外情况(如除以零、空引用、文件不存在等)时,会抛出(throw)异常。通过捕获(catch)和处理这些异常,开发者可以编写更健壮的代码,避免程序崩溃。
异常的基本概念[编辑 | 编辑源代码]
在C#中,异常是System.Exception类或其派生类的实例。异常处理的核心结构包括:
- try:包含可能抛出异常的代码块。
- catch:捕获并处理特定类型的异常。
- finally:无论是否发生异常都会执行的代码块(常用于资源清理)。
异常层次结构[编辑 | 编辑源代码]
异常处理语法[编辑 | 编辑源代码]
以下是基本的异常处理语法示例:
try
{
// 可能抛出异常的代码
int divisor = 0;
int result = 10 / divisor;
}
catch (DivideByZeroException ex)
{
Console.WriteLine($"错误:{ex.Message}");
}
finally
{
Console.WriteLine("无论是否发生异常都会执行");
}
输出:
错误:Attempted to divide by zero. 无论是否发生异常都会执行
常见异常类型[编辑 | 编辑源代码]
C#中预定义的常见异常包括:
异常类型 | 描述 |
---|---|
NullReferenceException | 尝试访问null对象的成员时抛出 |
ArgumentException | 方法的参数无效时抛出 |
IndexOutOfRangeException | 数组索引越界时抛出 |
FileNotFoundException | 尝试访问不存在的文件时抛出 |
FormatException | 格式转换失败时抛出(如将字符串转换为数字) |
自定义异常[编辑 | 编辑源代码]
开发者可以创建自定义异常类:
public class InsufficientFundsException : Exception
{
public decimal CurrentBalance { get; }
public decimal RequiredAmount { get; }
public InsufficientFundsException(decimal currentBalance, decimal requiredAmount)
: base($"余额不足。当前余额:{currentBalance},需要金额:{requiredAmount}")
{
CurrentBalance = currentBalance;
RequiredAmount = requiredAmount;
}
}
// 使用示例
try
{
throw new InsufficientFundsException(100m, 200m);
}
catch (InsufficientFundsException ex)
{
Console.WriteLine(ex.Message);
}
输出:
余额不足。当前余额:100,需要金额:200
异常处理最佳实践[编辑 | 编辑源代码]
1. 具体异常优先:先捕获具体的异常类型,最后捕获通用的Exception 2. 避免空的catch块:至少要记录异常信息 3. 使用finally释放资源:如文件流、数据库连接等 4. 不要用异常控制流程:异常处理应只用于真正的异常情况 5. 保留原始异常:使用InnerException属性保留原始异常信息
多层异常处理示例[编辑 | 编辑源代码]
try
{
try
{
File.ReadAllText("nonexistent.txt");
}
catch (FileNotFoundException ex)
{
throw new ApplicationException("文件操作失败", ex);
}
}
catch (ApplicationException ex)
{
Console.WriteLine($"当前异常:{ex.Message}");
Console.WriteLine($"内部异常:{ex.InnerException?.Message}");
}
输出:
当前异常:文件操作失败 内部异常:Could not find file 'nonexistent.txt'.
数学公式示例[编辑 | 编辑源代码]
在某些情况下,异常可能与数学运算相关。例如,计算平方根时:
性能考虑[编辑 | 编辑源代码]
异常处理会带来性能开销,因此:
- 对于可预见的错误条件(如用户输入验证),应使用条件检查而非异常
- 在性能关键的代码路径中避免频繁抛出异常
总结[编辑 | 编辑源代码]
C#异常处理机制提供了结构化的方式来处理运行时错误。通过合理使用try-catch-finally结构、创建自定义异常以及遵循最佳实践,开发者可以编写出更健壮、更易维护的代码。记住,异常应该用于异常情况,而不应该替代正常的程序流程控制。