C# 异常处理(try catch)详解

在 C# 中,try...catch 是处理异常的核心机制,用于捕获和处理代码执行过程中可能出现的错误。以下是详细解析:


一、基本结构


csharp

try
{
    // 可能抛出异常的代码
}
catch (SpecificExceptionType ex)
{
    // 处理特定类型的异常
}
catch (Exception ex)
{
    // 处理所有其他异常
}
finally
{
    // 无论是否异常都会执行的代码(如释放资源)
}

二、核心组件详解

1. try 块
  • 作用:包裹可能抛出异常的代码。
  • 必须存在,后接 catch 或 finally(或两者)。
2. catch 块
  • 捕获异常:匹配特定类型的异常。
  • 多个 catch:按顺序从具体到一般排列。
  • 示例
    
    

    csharp

    catch (DivideByZeroException ex)
    {
        Console.WriteLine("除以零错误: " + ex.Message);
    }
    catch (Exception ex)
    {
        Console.WriteLine("其他错误: " + ex.Message);
    }
3. finally 块
  • 必然执行:无论是否发生异常,都会执行。
  • 典型用途:释放资源(关闭文件、数据库连接等)。
  • 无异常时的执行顺序try → finally
  • 发生异常时的顺序try → catch → finally

三、关键特性

1. 异常类型继承
  • 所有异常派生自 System.Exception
  • 常见内置异常
    • NullReferenceException(空引用)
    • IndexOutOfRangeException(索引越界)
    • FileNotFoundException(文件未找到)
2. 重新抛出异常
  • 保留堆栈信息:使用 throw; 而非 throw ex;
    
    

    csharp

    catch (Exception ex)
    {
        LogError(ex);
        throw; // 重新抛出原始异常
    }
3. 异常筛选器(C# 6.0+)
  • 使用 when 关键字 按条件捕获:
    
    

    csharp

    catch (HttpRequestException ex) when (ex.StatusCode == 404)
    {
        Console.WriteLine("资源未找到");
    }

四、使用场景 & 最佳实践

  1. 适用场景

    • 文件/网络 I/O 操作
    • 数据库访问
    • 用户输入验证
    • 第三方 API 调用
  2. 避免滥用

    • 不要用异常处理正常逻辑(例如用 if 检查 null 而非依赖异常)。
    • 不要使用空的 catch 块(至少记录错误)。
  3. 最佳实践

    • 记录异常信息(如 ex.ToString())。
    • 在 finally 中释放非托管资源。
    • 优先使用具体的异常类型。

五、完整示例


csharp

try
{
    string text = File.ReadAllText("missing.txt");
}
catch (FileNotFoundException ex)
{
    Console.WriteLine($"文件未找到: {ex.FileName}");
}
catch (IOException ex) when (ex.Message.Contains("正在使用"))
{
    Console.WriteLine("文件被占用");
}
catch (Exception ex)
{
    Console.WriteLine($"未知错误: {ex.Message}");
}
finally
{
    Console.WriteLine("清理完成");
}

六、常见错误

  • 捕获顺序错误:将 catch (Exception) 放在具体异常之前。
  • 忽略异常:空的 catch 块导致静默失败。
  • 资源泄漏:忘记在 finally 中关闭文件/连接。

通过合理使用 try...catch,可以显著提升程序的健壮性和可维护性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值