写代码时出错了?别慌,搞懂错误处理就稳了

刚学写代码的朋友常有个错觉:高手写的程序从不出错。其实不是不出错,是他们早把“出错”当成日常流程的一部分——就像做饭时盐放多了,得马上尝一口、补点糖,而不是扔锅不干。

错误不是bug,是程序在说话

运行一段Python代码,突然弹出 ZeroDivisionError: division by zero,这不是系统在骂你,是在说:“喂,你让电脑算 5 ÷ 0,数学上没定义啊!”

这种报错信息,就是程序在用它的方式跟你沟通。关键不是躲着它,而是学会听懂它说啥、在哪说、为啥说。

试试用 try...except 拦一拦

比如你写了个小工具,让用户输入年龄,再算他出生年份:

age = int(input("请输入年龄:"))
birth_year = 2024 - age
print(f"你大概出生于 {birth_year} 年")

可万一用户手滑输了个“二十”,程序直接崩了。加个防护就踏实多了:

try:
age = int(input("请输入年龄:"))
birth_year = 2024 - age
print(f"你大概出生于 {birth_year} 年")
except ValueError:
print("哎哟,这里得输数字哦,比如 25、30 这样的")

这时候程序不会退出,而是温和提醒,继续等下一次输入。

不同错误,分门别类接住

不是所有错误都一样。用户输错类型(ValueError)、打开不存在的文件(FileNotFoundError)、网络连不上(ConnectionError),每种都值得单独对待:

try:
with open("data.txt", "r") as f:
content = f.read()
except FileNotFoundError:
print("找不到 data.txt,先帮你建一个空白文件吧")
with open("data.txt", "w") as f:
f.write("")
except PermissionError:
print("这个文件被锁住了,检查下是不是正在用记事本编辑着?")

就像修车师傅不会拿扳手去修手机屏幕——对症下药,才省力又靠谱。

别忘了 finally:收尾的事,总得有人干

有些操作,不管成没成功,都得善后。比如打开了一个数据库连接,哪怕中间出错了,也得关掉它:

conn = None
try:
conn = connect_to_db()
run_query(conn, "SELECT * FROM users")
except DatabaseError as e:
print("查数据时出了问题:", str(e))
finally:
if conn:
conn.close()
print("数据库连接已安全关闭")

这里的 finally 就像煮完面不忘关火,习惯养好了,程序才真正“有始有终”。

错误处理不是给代码贴创可贴,而是帮它长出适应力。你写的每一行 except,都在让程序多一分从容,少一分崩溃。下次看到红色报错,别急着删代码——先读两遍,说不定它正悄悄教你新东西。