在 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("资源未找到"); }
四、使用场景 & 最佳实践
-
适用场景:
- 文件/网络 I/O 操作
- 数据库访问
- 用户输入验证
- 第三方 API 调用
-
避免滥用:
- 不要用异常处理正常逻辑(例如用
if检查null而非依赖异常)。 - 不要使用空的
catch块(至少记录错误)。
- 不要用异常处理正常逻辑(例如用
-
最佳实践:
- 记录异常信息(如
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,可以显著提升程序的健壮性和可维护性。

详解&spm=1001.2101.3001.5002&articleId=146121102&d=1&t=3&u=444cf28a29cd453aae6518b928943b3e)
1万+

被折叠的 条评论
为什么被折叠?



