写程序时,谁都会遇到错误。可能是少了个括号,也可能是用户输入了不该输的内容。关键不是不出错,而是出错后程序别直接“罢工”。学会处理错误,代码才更稳当。
错误分两种:能预判的和突然冒出来的
有些错误你能想到,比如让用户输入年龄,他偏偏填了个“abc”。这种可以用条件判断提前拦住:
age = input("请输入年龄:")
if age.isdigit():
print(f"明年你 {int(age) + 1} 岁")
else:
print("请输数字!")
但有些问题没法靠判断抓到,比如读一个不存在的文件,或者网络突然断了。这时候就得靠异常处理机制。
用 try-except 捕获意外
Python 里最常见的做法是 try-except。把可能出问题的代码放进 try 块,万一真出错了,就跳到 except 处理:
try:
with open("data.txt", "r") as f:
content = f.read()
print(content)
except FileNotFoundError:
print("文件没找到,检查下名字对不对")
这样程序不会因为找不到文件就崩溃,而是友好地提示用户。
别捕获所有错误,要精准一点
有人图省事,直接用 except: 捕获所有异常,看起来省心,其实隐患大。比如你本想处理除零错误,结果变量名写错了都没发现:
try:
result = x / 0 # 这里x未定义,也会被except吃掉
except:
print("出错了") # 错误类型被掩盖
最好明确写出要捕获的异常类型,比如 ZeroDivisionError、ValueError,这样既安全又清晰。
finally 用来收尾
有时候不管出不出错,都得做点事,比如关闭文件、断开连接。这时 finally 就派上用场了:
file = None
try:
file = open("log.txt", "w")
file.write("开始运行")
result = 10 / 0
except ZeroDivisionError:
print("不能除以零")
finally:
if file:
file.close()
print("文件已关闭")
就算中间出错,finally 里的代码也会执行,保证资源不泄露。
主动抛出错误也有用
有些情况你要主动提醒别人出错了。比如函数收到不合理参数,可以自己 raise 一个异常:
def set_age(age):
if age < 0 or age > 150:
raise ValueError("年龄必须在0到150之间")
print(f"年龄设置为 {age}")
这样调用者就知道问题出在哪,而不是默默执行出错结果。
处理错误不是为了让程序“永不失败”,而是让它失败得体面一点,让人知道发生了什么,还能继续用下去。这才是好程序该有的样子。