一、先搞懂:什么是异常?
正常代码:从上到下顺顺利利跑完。异常 :代码运行中途出错了 ,程序直接崩掉、停止运行。
常见你会遇到的错误:
- 网络断了、网页打不开
- 接口返回不是 JSON,解析报错
- Selenium 找不到页面元素
- 列表取值超出索引
- 除数为 0
如果不加异常处理:只要一处报错,整个程序直接卡死终止。
异常处理的作用: 代码出错不崩溃,捕获错误、打印原因、程序可以继续往下跑,爬虫必备核心技能。
二、最核心基础语法:try ... except
try:
# 有可能出错的代码写在这里
可能报错的代码
except:
# 如果上面代码出错了,就执行这里
出错后要做的事
通俗理解
try:试着执行里面的代码- 没出错 → 正常跑完,跳过 except
- 出错了 → 立刻跳到 except 里面执行,程序不会崩溃
简单示例(一看就懂)
try:
a = 1 / 0 # 数学错误:除数不能为0
except:
print("代码出错了,但是程序没有崩溃")
运行结果:
代码出错了,但是程序没有崩溃
三、进阶 1:捕获具体异常(最重要,不要乱用万能捕获)
上面直接写 except: 是捕获所有错误,新手不推荐,会隐藏 bug。
常见基础异常
| 异常名 | 含义 |
|---|---|
ZeroDivisionError |
除零错误 |
IndexError |
列表索引越界 |
KeyError |
字典没有这个键 |
FileNotFoundError |
文件找不到 |
requests.exceptions.RequestException |
爬虫网络请求所有错误 |
NoSuchElementException |
Selenium 找不到元素 |
捕获指定异常写法
try:
a = 1 / 0
except ZeroDivisionError:
print("捕获到:除数不能为0")
好处:只处理你预判的错误,别的错误正常报错,方便排查 bug。
四、进阶 2:捕获异常信息(看具体错在哪)
语法:except 异常类型 as e``e 就是错误详情信息。
try:
a = 1 / 0
except ZeroDivisionError as e:
print("错误详情:", e)
输出:
错误详情: division by zero
五、进阶 3:多个 except,分别处理不同错误
一段代码可能出多种错,可以分开捕获:
lst = [1,2,3]
try:
print(lst[10]) # 索引越界
a = 1 / 0
except IndexError as e:
print("索引错误:", e)
except ZeroDivisionError as e:
print("除零错误:", e)
六、进阶 4:else 分支(没出错才执行)
try:
代码
except:
出错执行
else:
没出错才执行
示例:
try:
num = 10
except:
print("出错了")
else:
print("代码正常执行,没有异常")
适用场景:逻辑正常才继续下一步操作。
七、进阶 5:finally 分支(无论错没错,一定执行)
这是爬虫、文件操作 超级常用的!
try:
可能出错代码
except:
出错处理
finally:
无论有没有异常,这里必定执行
爬虫最常用场景
- 爬完必须关闭浏览器
driver.quit() - 必须关闭文件、关闭数据库连接
示例:
python
运行
try:
print("开始爬取数据")
a = 1 / 0
except:
print("爬取出错")
finally:
print("无论成功失败,都执行收尾工作:关闭浏览器/关闭文件")
八、进阶 6:万能捕获(实在不知道什么错误时用)
try:
# 爬虫请求、解析代码
pass
except Exception as e:
print("程序出错,错误信息:", e)
Exception 是所有普通异常的父类,能捕获绝大多数错误。
✅ 适合写爬虫快速兜底❌ 不适合开发正式项目(隐藏 bug)
九、主动抛出异常 raise
自己手动制造一个错误,主动终止逻辑并提示。
def age_check(age):
if age < 0:
raise ValueError("年龄不能为负数")
print("年龄合法")
age_check(-5)
用途:写函数时,不符合规则就主动报错提醒。
十、一套【爬虫专用 异常处理标准模板】
直接以后写代码照抄就行:
import requests
url = "https://spa1.scrape.center/"
try:
# 可能出错:网络超时、网站打不开、解析失败
res = requests.get(url, timeout=5)
res.encoding = "utf-8"
print("请求成功")
except Exception as e:
print("请求出错了:", e)
finally:
print("本次请求结束")
Selenium 标准模板:
from selenium import webdriver
driver = webdriver.Chrome()
try:
driver.get("https://spa1.scrape.center/")
# 找元素、爬数据
except Exception as e:
print("Selenium 运行出错:", e)
finally:
# 无论成败,必定关闭浏览器,不残留进程
driver.quit()
十一、新手必须记住 3 条规则(少踩坑)
- 能指定异常就指定,不要随便裸写
except: - 文件、浏览器、数据库 一定要写在 finally 里关闭
- 爬虫必须加 try-except,不然一条错了整个程序直接崩
十二、一句话总结全套机制
- try:放可能出错的代码
- except:捕获错误,处理错误,程序不崩溃
- else:没出错才执行
- finally:不管错没错,必执行(收尾专用)
- as e:打印具体错误原因
- Exception:万能兜底捕获
你现在只要记住 try + except + finally 这三个,写爬虫完全够用,我可以接下来给你出几道超简单练习题,带你练一遍马上吃透。