异常捕获与处理:别让一个小错误崩掉整个程序
你有没有遇到过这种情况:辛辛苦苦写完一段代码,运行时却因为一个没考虑到的输入直接报错退出?比如让用户输入数字,结果他手一滑打了字母,程序立马“罢工”。这时候,异常捕获与处理就是你的救星。
在编程中,异常是程序运行时出现的意外情况,比如除以零、文件找不到、网络断开等。如果不加干预,这些异常会直接中断程序执行。而通过合理的异常处理机制,我们可以提前“设防”,让程序在出问题时也能优雅应对,而不是直接崩溃。
用 try-except 捕获异常
以 Python 为例,最常见的做法是使用 try-except 结构。把可能出错的代码放在 try 块里,一旦发生异常,就跳转到对应的 except 块进行处理。
try:
num = int(input("请输入一个数字:"))
result = 100 / num
print(f"结果是:{result}")
except ValueError:
print("输入格式不对,得输数字!")
except ZeroDivisionError:
print("不能除以零啊兄弟!")这样哪怕用户乱输,程序也不会直接挂掉,而是给出提示,继续运行。
实际场景中的应用
想想你在写一个批量处理文件的小工具。成百上千个文件等着读取,结果第一个文件路径错了,程序抛个异常退出——后面几百个文件都白搭了。如果加上异常处理,就可以跳过出错的文件,继续处理剩下的。
import os
files = ["data1.txt", "data2.txt", "missing.txt", "data3.txt"]
for filename in files:
try:
with open(filename, 'r', encoding='utf-8') as f:
content = f.read()
print(f"成功读取 {filename}:{len(content)} 字符")
except FileNotFoundError:
print(f"警告:{filename} 找不到,跳过。")
except PermissionError:
print(f"权限不足,无法读取 {filename}")这样一来,程序的健壮性就大大提升,哪怕环境不完美,也能尽可能完成任务。
别忽视 finally 的作用
有些操作必须执行,不管有没有异常,比如关闭文件、释放资源。finally 块就是干这个的。
file_handle = None
try:
file_handle = open("log.txt", "w")
file_handle.write("开始记录...")
# 这里可能发生异常
risky_operation()
except Exception as e:
print(f"出错了:{e}")
finally:
if file_handle:
file_handle.close()
print("文件已安全关闭")即使中间出了问题,finally 里的关闭操作依然会执行,避免资源泄漏。
异常处理不是万能药,也不能滥用。捕获异常后该做什么,得想清楚。是重试?记录日志?还是给用户友好提示?每种选择都影响程序的实际体验。关键是提前预判哪些地方容易出问题,在关键节点布好“防护网”,让程序真正像老司机一样,遇到坑也能平稳绕过去。