跳转到内容

C Sharp 异常概述

来自代码酷

C#异常概述[编辑 | 编辑源代码]

异常(Exception)是C#编程中用于处理程序运行时错误的一种机制。当程序执行过程中遇到意外情况(如除以零、空引用、文件不存在等)时,会抛出(throw)异常。通过捕获(catch)和处理这些异常,开发者可以编写更健壮的代码,避免程序崩溃。

异常的基本概念[编辑 | 编辑源代码]

在C#中,异常是System.Exception类或其派生类的实例。异常处理的核心结构包括:

  • try:包含可能抛出异常的代码块。
  • catch:捕获并处理特定类型的异常。
  • finally:无论是否发生异常都会执行的代码块(常用于资源清理)。

异常层次结构[编辑 | 编辑源代码]

classDiagram class Object class Exception { +string Message +string StackTrace +Exception InnerException } Object <|-- Exception Exception <|-- SystemException Exception <|-- ApplicationException SystemException <|-- ArgumentNullException SystemException <|-- DivideByZeroException SystemException <|-- IndexOutOfRangeException

异常处理语法[编辑 | 编辑源代码]

以下是基本的异常处理语法示例:

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'.

数学公式示例[编辑 | 编辑源代码]

在某些情况下,异常可能与数学运算相关。例如,计算平方根时:

xx<0时会抛出ArgumentException

性能考虑[编辑 | 编辑源代码]

异常处理会带来性能开销,因此:

  • 对于可预见的错误条件(如用户输入验证),应使用条件检查而非异常
  • 在性能关键的代码路径中避免频繁抛出异常

总结[编辑 | 编辑源代码]

C#异常处理机制提供了结构化的方式来处理运行时错误。通过合理使用try-catch-finally结构、创建自定义异常以及遵循最佳实践,开发者可以编写出更健壮、更易维护的代码。记住,异常应该用于异常情况,而不应该替代正常的程序流程控制。