Python 的 try 语句(异常处理)详细介绍

Python 的 try 语句(异常处理)详细介绍

在 Python 中,try语句是异常处理(Error Handling) 的核心机制,用于捕获和处理程序运行过程中出现的错误(如语法错误之外的运行时错误:除零错误、索引越界、网络请求失败等),避免程序因错误直接崩溃,让程序具备更强的鲁棒性。(在编程领域,鲁棒性(Robustness) 指的是程序在面对异常、错误、非法输入或恶劣环境时,能够保持稳定运行而不崩溃,并且能合理处理这些异常情况的能力。简单来说,就是程序的 “抗造”“耐折腾” 程度。

一、异常的基本概念

异常是程序运行时发生的不正常情况(错误),比如:

ZeroDivisionError:除数为 0;IndexError:列表索引超出范围;KeyError:字典键不存在;requests.exceptions.RequestException:网络请求失败(如超时、连接拒绝);FileNotFoundError:文件不存在。

如果不处理这些异常,程序会直接终止并抛出错误信息;而try语句可以捕获这些异常,并执行自定义的处理逻辑。

二、try 语句的完整语法结构

Python 的try语句有多种组合形式,从简单到复杂依次为:try-excepttry-except-elsetry-except-finallytry-except-else-finally

1. 基础结构:try-except(核心)

这是最常用的形式,用于捕获并处理指定的异常

try: # 可能引发异常的代码块(受保护的代码) risky_code() except [异常类型1] [as 异常对象]: # 当异常类型1发生时,执行的处理逻辑 handle_exception1() except [异常类型2] [as 异常对象]: # 当异常类型2发生时,执行的处理逻辑 handle_exception2() except: # 捕获所有未被上面捕获的异常(兜底处理,不推荐滥用) handle_all_other_exceptions() 

关键说明

try块:存放可能出现异常的代码(如网络请求、文件操作、数据类型转换等)。except块:当try块中发生指定类型的异常时,执行该块的代码;可以有多个except块,分别处理不同类型的异常。as 异常对象:可选,用于获取异常的详细信息(如错误描述、堆栈信息),常用变量名:eerr

示例 1:捕获特定异常

try: a = 10 / 0 # 会引发ZeroDivisionError b = [1, 2, 3][5] # 会引发IndexError(但上面的错误先发生,这行不会执行) except ZeroDivisionError as e: print(f"错误:除数不能为0,异常信息:{e}") except IndexError as e: print(f"错误:索引越界,异常信息:{e}") 

输出:错误:除数不能为0,异常信息:division by zero

示例 2:捕获多个异常(简写)如果多个异常的处理逻辑相同,可以将它们放在一个except块中,用元组包裹:

try: data = {"name": "张三"} print(data["age"]) # KeyError # num = int("abc") # ValueError except (KeyError, ValueError) as e: print(f"发生了键错误或值错误:{e}") 

示例 3:兜底捕获所有异常(不推荐)使用无参数的except可以捕获所有异常,但会隐藏未知的错误,不利于调试,仅建议在程序顶层做兜底处理:

try: 10 / 0 except ZeroDivisionError as e: print(f"除数为0:{e}") except: print(f"发生了未知错误:{e}") # 兜底处理 
2. 扩展结构:try-except-else

try块中没有发生任何异常时,会执行else块的代码(else块是可选的)。

try: # 可能引发异常的代码 result = 10 / 2 except ZeroDivisionError as e: print(f"错误:{e}") else: # 无异常时执行的代码 print(f"计算结果:{result}") 

输出:计算结果:5.0

作用将 “正常逻辑” 和 “异常处理逻辑” 分离,代码结构更清晰(else块只执行正常情况的逻辑)。

仅当try块中的代码:正常执行完毕(没有引发任何异常);且没有被returnbreakcontinue等语句中断;才会执行else块的代码。如果try块中引发了异常:程序会立即跳转到对应的except块中执行异常处理逻辑;else块的代码会被完全跳过,不会执行。
3. 完整结构:try-except-finally

finally块中的代码无论是否发生异常,都会执行finally块是可选的),常用于释放资源(如关闭文件、关闭网络连接、释放锁等)。

try: # 可能引发异常的代码 f = open("test.txt", "r") content = f.read() except FileNotFoundError as e: print(f"错误:文件不存在,{e}") finally: # 无论是否异常,都会执行:关闭文件 if 'f' in locals() and not f.closed: f.close() print("文件已关闭") 

关键特性

即使try块中有returnbreakcontinue等语句,finally块仍会执行;常用于资源的清理工作,避免资源泄漏。
4. 终极结构:try-except-else-finally

整合所有部分,覆盖所有场景:

try: num = int(input("请输入一个整数:")) result = 10 / num except ValueError as e: print(f"错误:请输入有效的整数,{e}") except ZeroDivisionError as e: print(f"错误:除数不能为0,{e}") else: print(f"10 / {num} = {result}") finally: print("程序执行完毕(无论是否异常,都会显示)") 

三、异常对象的常用操作

通过as 异常对象可以获取异常的详细信息,常用操作:

直接打印异常对象:获取错误描述(如print(e));获取异常类型type(e)获取异常的堆栈信息:使用traceback模块(适合调试)。
import traceback try: 10 / 0 except Exception as e: # 打印错误描述 print(f"异常描述:{e}") # 打印异常类型 print(f"异常类型:{type(e)}") # 打印完整的堆栈信息(包含出错的行号、文件路径) print("堆栈信息:") traceback.print_exc() 

五、try 语句的使用场景(爬虫 / 开发常用)

1. 网络请求(处理网络异常)

爬虫中网络请求容易出现超时、连接拒绝、DNS 错误等异常,必须用try处理:

import requests HEADERS = {"User-Agent": "Mozilla/5.0"} url = "https://movie.douban.com/top250" try: response = requests.get(url, headers=HEADERS, timeout=10) response.raise_for_status() # 触发HTTP错误(如403、404、500) except requests.exceptions.Timeout as e: print(f"错误:请求超时,{e}") except requests.exceptions.HTTPError as e: print(f"错误:HTTP状态码异常,{e}") except requests.exceptions.RequestException as e: print(f"错误:网络请求失败,{e}") else: print(f"请求成功,状态码:{response.status_code}") 
2. 文件操作(处理文件不存在、权限错误)
try: with open("douban_top50.csv", "r", encoding="utf-8-sig") as f: content = f.read() except FileNotFoundError as e: print(f"错误:文件不存在,{e}") except PermissionError as e: print(f"错误:没有文件读取权限,{e}") except UnicodeDecodeError as e: print(f"错误:文件编码错误,{e}") else: print(f"文件读取成功,内容长度:{len(content)}") 
3. 数据解析(处理数据格式异常)

爬虫解析数据时,可能因网页结构变化导致标签不存在,需处理异常:

from bs4 import BeautifulSoup html = '<div><span>肖申克的救赎</span></div>' soup = BeautifulSoup(html, "html.parser") try: movie_name = soup.find("span", class_="title").text movie_score = soup.find("span", class_="rating_num").text # 该标签不存在,触发AttributeError except AttributeError as e: print(f"错误:标签不存在,{e}") movie_score = "未知" finally: print(f"电影名称:{movie_name},评分:{movie_score}") 

输出:错误:标签不存在,'NoneType' object has no attribute 'text'电影名称:肖申克的救赎,评分:未知

六、使用 try 的最佳实践

精准捕获异常:尽量捕获具体的异常类型(如ZeroDivisionError),避免使用无参数的except(兜底除外),否则会隐藏未知错误;保持 try 块最小化:只在try块中放入可能引发异常的代码,不要将无关代码放入,便于定位错误;使用 finally 释放资源:对于文件、网络连接、数据库连接等资源,务必在finally中释放,或使用上下文管理器(with语句,底层也是基于finally实现);异常信息要明确:处理异常时,打印清晰的错误信息(如异常类型、错误原因、发生位置),便于调试;避免过度使用异常:异常处理是为了处理不可预见的错误,不要用异常处理替代正常的逻辑判断(如不要用try-except判断列表是否为空,应直接用if not lst)。

七、与上下文管理器(with 语句)的结合

Python 中的with语句是异常处理的语法糖,常用于资源管理(如文件、网络连接),它会自动在代码块结束后释放资源,即使发生异常也不例外(底层调用了__enter____exit__方法,__exit__中包含了finally的逻辑)。

示例:用 with 语句简化文件操作(替代 try-finally)

# 无需手动关闭文件,with语句会自动处理 try: with open("test.txt", "r") as f: content = f.read() except FileNotFoundError as e: print(f"错误:文件不存在,{e}") else: print(f"文件内容:{content}") 

总结

        Python 的try语句是处理运行时异常的核心工具,通过try-except捕获异常、else执行正常逻辑、finally释放资源,能让程序在面对错误时更健壮。在爬虫、文件操作、数据处理等场景中,合理使用try语句是编写生产级代码的必备技能。同时,遵循精准捕获、最小化 try 块、明确异常信息等最佳实践,能让异常处理代码更优雅、更易维护。

Read more

Linux】查看系统版本的 3 种方法:cat /etc/os-release 最实用

正是基于这样的背景,本文将引导您掌握几种核心的查询方法,并最终解释为何 cat /etc/os-release 能够在这场“实用性”的竞赛中脱颖而出。 二、传统且经典的方法:lsb_release lsb_release 是一个历史悠久且广为人知的命令,它的名字源于 LSB(Linux Standard Base)。LSB项目致力于为Linux发行版建立一套二进制接口兼容性标准,以增强不同发行版之间的应用程序兼容性。lsb_release 命令就是这个标准的一部分,用于显示当前发行版的具体LSB信息。 1. 命令的安装 值得注意的是,在某些极简安装的Linux系统中,lsb_release 可能不是默认安装的。如果你的系统提示找不到该命令,需要手动安装它。 在基于Debian/Ubuntu的系统上: 代码语言:javascript AI代码解释 sudo apt update sudo apt install lsb-release 在基于RHEL/CentOS/

By Ne0inhk
Flutter 三方库 cloudflare 鸿蒙云边协同分发流适配精讲:直连全球高速存储网关阵列无缝吞吐海量动静态画像资源,构筑大吞吐业务级网络负载安全分流-适配鸿蒙 HarmonyOS ohos

Flutter 三方库 cloudflare 鸿蒙云边协同分发流适配精讲:直连全球高速存储网关阵列无缝吞吐海量动静态画像资源,构筑大吞吐业务级网络负载安全分流-适配鸿蒙 HarmonyOS ohos

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 cloudflare 鸿蒙云边协同分发流适配精讲:直连全球高速存储网关阵列无缝吞吐海量动静态画像资源,构筑大吞吐业务级网络负载安全分流大坝 在多媒体应用、电商应用及各类跨平台开发中,高效地上传与管理图片、视频等重型资源是核心挑战。cloudflare 库为开发者提供了直接对接 Cloudflare 全球网络服务的桥梁。本文将详细探讨该库在 OpenHarmony 环境下的深度适配与优化。 前言 Cloudflare 提供了一套完整的边缘计算与存储方案,包括 R2 存储、Images 图像处理和 Stream 视频流。在鸿蒙操作系统这个面向万物智联的生态中,利用全球化的 CDN 和边缘优化能力,可以显著降低长距离传输的延迟(如海外用户访问鸿蒙国产应用)。本文将指导你如何在鸿蒙端利用 cloudflare 库实现极致的上传下载体验。 一、原理解析 1.1 基础概念 cloudflare 库通过 RESTful API

By Ne0inhk

Ubuntu 安装 Docker 超详细教程(含配置镜像加速与常见命令)

目录 一、前言 二、Docker 的安装 (Ubuntu) 1. 卸载旧版本(可选) 2. 配置 Docker 的 APT 仓库 3. 安装 Docker 4. 启动和校验 三、配置镜像加速(强烈建议!) 1. 编辑 daemon.json 配置文件 2. 重新加载配置并重启 Docker 四、Docker 常见指令 1. Docker 服务相关命令 (systemctl) 2. 镜像相关命令 3. 容器相关命令 docker run 常见参数详解: 其他容器命令: 五、总结 一、

By Ne0inhk
Flutter 组件 intl_messages 的适配 鸿蒙Harmony 实战 - 驾驭百万级多语言消息系统、实现鸿蒙端异步国际化与文本语义插值治理方案

Flutter 组件 intl_messages 的适配 鸿蒙Harmony 实战 - 驾驭百万级多语言消息系统、实现鸿蒙端异步国际化与文本语义插值治理方案

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 intl_messages 的适配 鸿蒙Harmony 实战 - 驾驭百万级多语言消息系统、实现鸿蒙端异步国际化与文本语义插值治理方案 前言 在鸿蒙(OpenHarmony)生态的全球化政务协同门户、多语言即时通讯系统以及需要支持上百个语种实时热更新的各类专业应用中,“文本翻译的加载效率与动态解析能力”是决定用户交互质感的最后一道“感知防线”。面对包含上万条多语言 Key、具备复杂复数规则与动态变量插值的 0307 批次资产资产。如果依然采用基于“同步 JSON 预拉取”或“静态代码生成(Code Generation)”的传统国际化模式。不仅会导致在应用启动初期产生严重的内存峰值与 IO 阻塞,更会因为无法实现在不更新 HAP 的前提下修改单条翻译,引发严重的运营维护滞后风险。 我们需要一种“异步解耦、语义对齐”的国际化艺术。 intl_messages

By Ne0inhk