python异常处理机制详解

一、先搞懂:什么是异常?

正常代码:从上到下顺顺利利跑完。异常 :代码运行中途出错了 ,程序直接崩掉、停止运行。

常见你会遇到的错误:

  • 网络断了、网页打不开
  • 接口返回不是 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 条规则(少踩坑)

  1. 能指定异常就指定,不要随便裸写 except:
  2. 文件、浏览器、数据库 一定要写在 finally 里关闭
  3. 爬虫必须加 try-except,不然一条错了整个程序直接崩

十二、一句话总结全套机制

  1. try:放可能出错的代码
  2. except:捕获错误,处理错误,程序不崩溃
  3. else:没出错才执行
  4. finally:不管错没错,必执行(收尾专用)
  5. as e:打印具体错误原因
  6. Exception:万能兜底捕获

你现在只要记住 try + except + finally 这三个,写爬虫完全够用,我可以接下来给你出几道超简单练习题,带你练一遍马上吃透。

相关推荐
quantdash_cc2 分钟前
个人开发者用 QuantDash 读取港股行情:00700.HK 的 Python 函数封装与校验实践
python·数据分析·pandas·量化交易·股票数据·quantdash
fengci.5 分钟前
CTF2困难部分
开发语言·网络·python·安全·php
佳得动6 分钟前
编译和链接的认识(C语言)
c语言·开发语言
小小张说故事10 分钟前
Python 的 0.1 + 0.2 为什么不等于 0.3?拆开 IEEE 754 与那串死循环小数
后端·python
LK_0715 分钟前
【Agent】工具调用的安全边界:从模型输出到程序执行
人工智能·笔记·python·agent
大黄说说16 分钟前
PHP 异步怎么实现?Swoole、Workerman 使用场景对比
开发语言·php·swoole
十二同学啊17 分钟前
Python 工程化详解:项目结构、依赖管理、代码质量、测试与部署
java·开发语言·python
打工仔折腾 AI18 分钟前
鸿蒙移动端直连 Windows 远程桌面配置与性能调优实践
人工智能·windows·后端·python·华为·性能优化·harmonyos
乐橙开放平台23 分钟前
跨地域监控难管理?通过 GB28181 把各地海康大华乐橙摄像头注册到云端平台
开发语言·笔记·物联网·自动化·php·音视频·智能家居
广东融科数据服务有限公司25 分钟前
网络监控经常卡顿、掉线、画面模糊?一线排查问答实录
开发语言·网络·php