C# 学习笔记 11:给程序穿上防弹衣 —— 异常处理 (Try / Catch)
💥 开篇:皮皮的“玻璃心”程序
皮皮(Pipi)写了一个伤害计算器。 逻辑非常简单:
每只怪物的伤害 = 总伤害 ÷ 怪物数量
int totalDamage = 1000;int monsterCount = 0; // 假设这次刚好没有怪物int damagePerMonster = totalDamage / monsterCount; // 💀 砰!
程序瞬间崩溃, 屏幕弹出一行冰冷的文字:
System.DivideByZeroException
游戏直接关闭。
皮皮(惊恐):“我只是算错了一个数而已,为什么整个程序要陪葬?!”
瓜瓜(淡定):“因为你没给它穿防护装备。 程序一旦遇到无法处理的意外,默认行为就是——原地去世。”
第一关:危险动作请围观(try)
在 C# 里,我们可以提前告诉程序:
“下面这段代码有风险,先别慌。”
这就是 try 的作用。
try{// 🚧 危险操作区}
📌 一句人话:
try = 我知道这事可能翻车,但我想试试
第二关:安全气囊弹出(catch)
光“尝试”还不够, 你还得告诉程序:
“如果真的翻车了,该怎么办。”
这就是 catch。
try{int totalDamage = 1000;int monsterCount = 0;int damagePerMonster = totalDamage / monsterCount; Console.WriteLine("计算完成!");}catch (Exception ex){ Console.WriteLine("哎呀!出错了!"); Console.WriteLine($"错误原因:{ex.Message}");}Console.WriteLine("游戏继续运行...");
瓜瓜解释一下发生了什么:
📌 重点记住:
try 里一旦出事,后面的代码不会再执行

第三关:对症下药(精确捕获异常)
皮皮学会了 catch (Exception),觉得自己已经天下无敌了。 不管什么错误,统一一句:
“出错了!”
结果—— 文件丢了,提示“除以零”; 断网了,提示“除以零”。
瓜瓜摇头:“你这是头疼医脚。异常也是有类型的。”
C# 允许你针对不同异常,写不同的处理方案:
try{string content = File.ReadAllText("config.txt");int number = int.Parse(content);int result = 100 / number;}catch (FileNotFoundException){ Console.WriteLine("配置文件没找到,请检查路径!");}catch (DivideByZeroException){ Console.WriteLine("配置里的数字不能为 0!");}catch (Exception ex){ Console.WriteLine($"发生未知错误:{ex.Message}");}
⚠️ 非常重要的规则
越具体的异常,越要写在前面
❌ 错误示范:
catch (Exception) { }catch (DivideByZeroException) { } // 永远进不来
记忆口诀:
小网先捞,大网兜底
第四关:善后必做(finally)
有些事情,不管成功还是失败,都必须做。
比如:
这时候就该 finally 出场了。
FileStream file = null;try{ file = File.Open("save.data", FileMode.Open);// 读档逻辑(这里可能会崩)}catch (Exception){ Console.WriteLine("读档失败!");}finally{// 无论如何,这里一定会执行if (file != null) { file.Close(); Console.WriteLine("文件已关闭。"); }}
一句话总结:
finally = 打扫战场,不接受任何借口
即使你在 try 里 return,finally 也会在你“离开前”强制执行一次。
总结:异常处理真正教你的是什么?
今日战利品
真正的编程成熟标志:
不是“永不出错”, 而是——出错了也能优雅地活下来。
课后思考(面试高频)
如果在 try 里写了 return,finally 里的代码还会执行吗?
答案:会。finally 非常执着, 你走之前,它一定要最后跑一遍。
下期预告
我们在 finally 里频繁提到了:
皮皮想做一个真正的存档系统: 关掉游戏,下次还能接着玩。
👉 下一期:文件操作(File I/O)让你的数据,真正活在硬盘里。