第八章:Python异常处理(python 异常处理方法)
wptr33 2025-06-23 22:40 17 浏览
8.1 异常基础
8.1.1 理论知识
在程序运行过程中,可能会遇到各种错误,这些错误被称为异常。异常会导致程序的正常执行流程被中断。Python提供了异常处理机制,允许我们捕获并处理这些异常,使程序在遇到错误时能够更加健壮,避免崩溃。
常见的异常类型有很多,例如 ZeroDivisionError(除零错误)、FileNotFoundError(文件未找到错误)、TypeError(类型错误)等。
8.1.2 示例代码
try:
result = 10 / 0
print(result)
except ZeroDivisionError:
print("不能除以零")
8.1.3 代码解释
- 在 try 块中,尝试执行 10 / 0 这一操作,该操作会引发 ZeroDivisionError 异常。
- 当异常发生时,程序不会崩溃,而是跳转到 except 块中执行相应的代码,即打印“不能除以零”。如果没有 try - except 结构,程序会因除零错误而终止并抛出异常信息。
8.2 捕获多种异常
8.2.1 理论知识
一个 try 块可能会引发多种不同类型的异常,我们可以使用多个 except 块来分别捕获不同类型的异常,并进行针对性的处理。
8.2.2 示例代码
try:
num1 = "10"
num2 = 2
result = num1 + num2
print(result)
another_result = 10 / 0
except TypeError:
print("类型错误,无法进行该操作")
except ZeroDivisionError:
print("不能除以零")
8.2.3 代码解释
- 在 try 块中,首先尝试将字符串 num1 和整数 num2 相加,这会引发 TypeError 异常。即使后续还有可能引发 ZeroDivisionError 的代码,但由于前面已经引发了 TypeError,程序会直接跳转到对应的 except TypeError 块,打印“类型错误,无法进行该操作”。如果 try 块中没有 TypeError,才会继续执行后面的代码,若遇到除零操作引发 ZeroDivisionError,则会执行 except ZeroDivisionError 块中的代码。
8.3 使用一个 except捕获多种异常
8.3.1 理论知识
可以在一个 except 语句中同时捕获多种异常类型,将这些异常类型放在一个元组中。
8.3.2 示例代码
try:
num1 = "10"
num2 = 2
result = num1 + num2
print(result)
another_result = 10 / 0
except (TypeError, ZeroDivisionError):
print("发生了类型错误或除零错误")
8.3.3 代码解释
- try 块中的代码与前面示例类似,可能引发 TypeError 或 ZeroDivisionError。
- 这里使用一个 except 块,通过将两种异常类型 TypeError 和 ZeroDivisionError 放在元组 (TypeError, ZeroDivisionError) 中来捕获这两种异常。无论引发哪种异常,都会执行该 except 块中的代码,打印“发生了类型错误或除零错误”。
8.4 获取异常信息
8.4.1 理论知识
有时候,我们不仅想知道发生了什么类型的异常,还想获取异常的具体信息。可以在 except 语句中使用 as 关键字来获取异常对象,通过该对象可以访问异常的详细信息。
8.4.2 示例代码
try:
with open('nonexistent_file.txt', 'r') as file:
content = file.read()
except FileNotFoundError as e:
print(f"文件未找到,异常信息: {e}")
8.4.3 代码解释
- 在 try 块中,尝试打开一个不存在的文件 nonexistent_file.txt,这会引发 FileNotFoundError 异常。
- 在 except 块中,使用 as e 将异常对象赋值给变量 e,然后通过 e 打印出异常的详细信息,例如“[Errno 2] No such file or directory: 'nonexistent_file.txt'”,这样能更清楚地了解异常发生的原因。
8.5 else子句
8.5.1 理论知识
try - except 结构可以包含一个 else 子句。当 try 块中没有引发任何异常时,会执行 else 子句中的代码。
8.5.2 示例代码
try:
num1 = 10
num2 = 2
result = num1 / num2
except ZeroDivisionError:
print("不能除以零")
else:
print(f"除法结果: {result}")
8.5.3 代码解释
- 在 try 块中进行除法运算 num1 / num2。如果没有发生 ZeroDivisionError 异常,程序会跳过 except 块,执行 else 块中的代码,即打印除法的结果。如果 try 块中引发了 ZeroDivisionError 异常,except 块会捕获并处理异常,else 块不会执行。
8.6 finally子句
8.6.1 理论知识
finally 子句无论 try 块中是否发生异常,都会执行。通常用于执行一些清理操作,如关闭文件、释放资源等。
8.6.2 示例代码
file = None
try:
file = open('test.txt', 'w')
file.write('一些测试内容')
except Exception as e:
print(f"发生异常: {e}")
finally:
if file:
file.close()
print("文件已关闭")
8.6.3 代码解释
- 在 try 块中,尝试打开一个文件 test.txt 并写入内容。如果在这个过程中发生异常,except 块会捕获并打印异常信息。
- 无论 try 块中是否发生异常,finally 块都会执行。这里检查 file 是否为 None(即文件是否成功打开),如果是则关闭文件并打印“文件已关闭”,确保文件资源得到正确释放。
8.7 自定义异常
8.7.1 理论知识
除了Python内置的异常类型,我们还可以定义自己的异常类。自定义异常类通常继承自内置的 Exception 类或其子类。通过自定义异常,可以在程序中根据特定的业务逻辑抛出有针对性的异常,使代码更易读和维护。
8.7.2 示例代码
class NegativeNumberError(Exception):
pass
def calculate_square_root(num):
if num < 0:
raise NegativeNumberError("不能计算负数的平方根")
import math
return math.sqrt(num)
try:
result = calculate_square_root(-4)
print(result)
except NegativeNumberError as e:
print(e)
8.7.3 代码解释
- 定义了一个自定义异常类 NegativeNumberError,它继承自 Exception 类。
- 在 calculate_square_root 函数中,如果传入的数字为负数,就使用 raise 关键字抛出 NegativeNumberError 异常,并附带错误信息。
- 在 try - except 块中调用 calculate_square_root(-4),由于传入负数,会引发自定义异常,except 块捕获该异常并打印异常信息“不能计算负数的平方根”。
相关推荐
- 什么是Java中的继承?如何实现继承?
-
什么是继承?...
- Java 继承与多态:从基础到实战的深度解析
-
在面向对象编程(OOP)的三大支柱中,继承与多态是构建灵活、可复用代码的核心。无论是日常开发还是框架设计,这两个概念都扮演着至关重要的角色。本文将从基础概念出发,结合实例与图解,带你彻底搞懂Java...
- Java基础教程:Java继承概述_java的继承
-
继承概述假如我们要定义如下类:学生类,老师类和工人类,分析如下。学生类属性:姓名,年龄行为:吃饭,睡觉老师类属性:姓名,年龄,薪水行为:吃饭,睡觉,教书班主任属性:姓名,年龄,薪水行为:吃饭,睡觉,管...
- java4个技巧:从继承和覆盖,到最终的类和方法
-
日复一日,我们编写的大多数Java只使用了该语言全套功能的一小部分。我们实例化的每个流以及我们在实例变量前面加上的每个@Autowired注解都足以完成我们的大部分目标。然而,有些时候,我们必须求助于...
- java:举例说明继承的概念_java继承的理解
-
在现实生活中,继承一般指的是子女继承父辈的财产。在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系。例如猫和狗都属于动物,程序中便可以描述为猫和狗继承自动物,同理,...
- 从零开始构建一款开源的 Vibe Coding 产品 Week1Day4:业界调研之 Agent 横向对比
-
前情回顾前面两天我们重点调研了了一下Cursor的原理和Cursor中一个关键的工具edit_file的实现,但是其他CodingAgent也需要稍微摸一下底,看看有没有优秀之处,下...
- 学会这几个插件,让你的Notepad++使用起来更丝滑
-
搞程序开发的小伙伴相信对Notepad++都不会陌生,是一个占用空间少、打开启动快的文件编辑器,很多程序员喜欢使用Notepad++进行纯文本编辑或者脚本开发,但是Notepad++的功能绝不止于此,...
- 将 node_modules 目录放入 Git 仓库的优点
-
推荐一篇文章Whyyoushouldcheck-inyournodedependencies[1]...
- 再度加码AI编程,腾讯发布AI CLI并宣布CodeBuddy IDE开启公测
-
“再熬一年,90%的程序员可能再也用不着写for循环。”凌晨两点半,王工还在公司敲键盘。他手里那份需求文档写了足足六页,产品经理反复改了三次。放在过去,光数据库建表、接口对接、单元测试就得写两三天。现...
- git 如何查看stash的内容_git查看ssh key
-
1.查看Stash列表首先,使用gitstashlist查看所有已保存的stash:...
- 6万星+ Git命令懒人必备!lazygit 终端UI神器,效率翻倍超顺手!
-
项目概览lazygit是一个基于终端的Git命令可视化工具,通过简易的TUI(文本用户界面)提升Git操作效率。开发者无需记忆复杂命令,即可完成分支管理、提交、合并等操作。...
- 《Gemini CLI 实战系列》(一)Gemini CLI 入门:AI 上命令行的第一步
-
谷歌的Gemini模型最近热度很高,而它的...
- deepin IDE新版发布:支持玲珑构建、增强AI智能化
-
IT之家8月7日消息,深度操作系统官方公众号昨日(8月6日)发布博文,更新推出新版deepin集成开发环境(IDE),重点支持玲珑构建。支持玲珑构建deepinIDE在本次重磅更...
- 狂揽82.7k的star,这款开源可视化神器,轻松创建流程图和图表
-
再不用Mermaid,你的技术文档可能已经在悄悄“腐烂”——图表版本对不上、同事改完没同步、评审会上被一句“这图哪来的”问得哑口无言。这不是危言耸听。GitHub2025年开发者报告显示,63%的新仓...
- 《Gemini CLI 实战系列》(五)打造专属命令行工具箱
-
在前几篇文章中,我们介绍了GeminiCLI的基础用法、效率提升、文件处理和与外部工具结合。今天我们进入第五篇...
- 一周热门
-
-
C# 13 和 .NET 9 全知道 :13 使用 ASP.NET Core 构建网站 (1)
-
程序员的开源月刊《HelloGitHub》第 71 期
-
详细介绍一下Redis的Watch机制,可以利用Watch机制来做什么?
-
如何将AI助手接入微信(打开ai手机助手)
-
SparkSQL——DataFrame的创建与使用
-
假如有100W个用户抢一张票,除了负载均衡办法,怎么支持高并发?
-
Java面试必考问题:什么是乐观锁与悲观锁
-
redission YYDS spring boot redission 使用
-
一文带你了解Redis与Memcached? redis与memcached的区别
-
如何利用Redis进行事务处理呢? 如何利用redis进行事务处理呢英文
-
- 最近发表
-
- 什么是Java中的继承?如何实现继承?
- Java 继承与多态:从基础到实战的深度解析
- Java基础教程:Java继承概述_java的继承
- java4个技巧:从继承和覆盖,到最终的类和方法
- java:举例说明继承的概念_java继承的理解
- 从零开始构建一款开源的 Vibe Coding 产品 Week1Day4:业界调研之 Agent 横向对比
- 学会这几个插件,让你的Notepad++使用起来更丝滑
- 将 node_modules 目录放入 Git 仓库的优点
- 再度加码AI编程,腾讯发布AI CLI并宣布CodeBuddy IDE开启公测
- git 如何查看stash的内容_git查看ssh key
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)