C# 异常处理入门:try/catch、finally 与 throw
程序跑着跑着总会遇到意外:用户输入的不是数字、要读的文件不存在、除数是零。这些运行时的错误在 C# 里叫异常(Exception)。不处理它,程序直接崩溃;处理得当,程序就能体面地提示并继续运行。这篇讲清楚 C# 异常处理的基本套路。
try/catch:接住异常
把可能出错的代码放进 try,出问题时 catch 会接住,程序不会崩:
Console.Write("请输入一个数字:");
string input = Console.ReadLine();
try
{
int num = int.Parse(input);
Console.WriteLine($"你输入的是 {num}");
}
catch (FormatException)
{
Console.WriteLine("这看起来不是个合法数字");
}
// 输入 abc 时输出:这看起来不是个合法数字
// 输入 42 时输出:你输入的是 42
int.Parse 遇到非法输入会抛出 FormatException,catch 指明了只接这一种异常。
捕获具体异常,别一把梭
catch 可以写多个,从具体到宽泛排列,命中哪个走哪个:
try
{
int a = 10, b = 0;
Console.WriteLine(a / b);
}
catch (DivideByZeroException ex)
{
Console.WriteLine($"除数不能为零:{ex.Message}");
// 输出:除数不能为零:Attempted to divide by zero.
}
catch (Exception ex)
{
Console.WriteLine($"出了个意外:{ex.Message}");
}
Exception 是所有异常的基类,放最后兜底。异常变量 ex 上的 Message 是错误描述,StackTrace 记录出错位置的调用链,排查问题时很有用。
finally:无论如何都执行
finally 里的代码不管出没出错都会执行,适合放清理逻辑,比如关闭文件、释放连接:
try
{
Console.WriteLine("开始处理任务");
int x = int.Parse("abc"); // 这里会抛异常
}
catch (FormatException)
{
Console.WriteLine("格式不对");
}
finally
{
Console.WriteLine("收尾工作,总会执行");
}
// 输出:
// 开始处理任务
// 格式不对
// 收尾工作,总会执行
throw:主动抛出异常
发现数据不合理时,可以自己抛异常,把问题在源头暴露出来:
static void SetAge(int age)
{
if (age < 0 || age > 150)
{
throw new ArgumentOutOfRangeException(nameof(age), "年龄必须在 0 到 150 之间");
}
Console.WriteLine($"年龄已设置为 {age}");
}
SetAge(250);
// 运行时输出异常信息:年龄必须在 0 到 150 之间
抛异常时选贴近语义的类型:参数问题用 ArgumentException 系列,取值越界用 ArgumentOutOfRangeException,也可以继承 Exception 定义自己的异常类型。
小结
记住四件事:可能出错的代码放 try;catch 优先捕获具体异常类型,基类 Exception 放最后兜底;清理资源放 finally,它总会执行;数据不合理就用 throw 在源头抛出去。日常开发里 catch 到异常要么处理、要么记录日志、要么重新抛出,别默默吞掉,否则出了问题很难查。