在C#程序里,异常是运行时出现的错误,比如空引用、文件不存在或网络中断。使用try-catch-finally结构可以捕获并处理这些异常,同时保证关键资源被释放。理解它们的分工,是写出可靠代码的基础。

try-catch-finally的基本结构
try块放置可能出错的代码,catch块处理指定类型的异常,finally块无论是否发生异常都会执行,常用来释放连接或文件流。
try
{
// 可能抛出异常的代码
int result = 10 / 0;
}
catch (DivideByZeroException ex)
{
// 处理除零异常
Console.WriteLine("不能除以零:" + ex.Message);
}
finally
{
// 一定会执行,适合做清理
Console.WriteLine("执行完毕");
}
最佳实践一:只捕获你能处理的异常
不要用catch (Exception)捕获所有异常,这会把程序错误和系统异常混在一起,掩盖真正的问题。应该捕获具体的异常类型,例如FileNotFoundException。
错误示例
try
{
DoWork();
}
catch (Exception ex)
{
// 吞掉所有异常,不利于排查
Log(ex);
}
推荐示例
try
{
ReadFile("test.txt");
}
catch (FileNotFoundException ex)
{
Console.WriteLine("文件未找到:" + ex.Message);
}
最佳实践二:用using代替手动finally释放
对于实现了IDisposable接口的对象,使用using语句能自动调用Dispose,比手写finally更安全简洁。
using (var reader = new StreamReader("data.txt"))
{
string content = reader.ReadToEnd();
Console.WriteLine(content);
}
// 离开using块时reader自动释放
最佳实践三:在finally中释放非托管资源
如果必须手动控制资源,把释放逻辑放在finally中,防止异常导致资源泄漏。
| 场景 | 推荐做法 |
|---|---|
| 文件流 | 使用using或finally关闭 |
| 数据库连接 | 使用using或finally关闭连接 |
| 网络套接字 | finally中调用Close |
总结
在C#里处理异常和错误,核心是用try-catch-finally保护可能失败的逻辑,只在必要时捕获具体异常,并借助using或finally确保资源回收。避免宽泛捕获和空catch块,可以让程序更健壮也更好维护。
C#异常try-catch-finally错误处理修改时间:2026-07-27 09:21:24