网站首页 > 技术文章 正文
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 块捕获该异常并打印异常信息“不能计算负数的平方根”。
- 上一篇: 72岁老翁学python编程(四)
- 下一篇: Python从1到N整数求和的方法汇总
猜你喜欢
- 2025-08-05 python学习笔记 1.常见的数据类型
- 2025-08-05 从进阶语法到实战应用:Python中级修炼指南
- 2025-08-05 Python 面试问题:运算符
- 2025-08-05 Python解析库lxml与xpath用法总结
- 2025-08-05 Python从1到N整数求和的方法汇总
- 2025-08-05 Python语言从2.7到3.14的能力变化与演进逻辑
- 2025-08-05 72岁老翁学python编程(四)
- 2025-08-05 Python运算符探秘:掌握编程艺术的秘密武器
- 2025-08-05 用Python实现素数相关算法并做注释说明
- 2025-08-05 Python 异常机制详解:从 Error 类型到 rais
- 08-05python决策树用于分类和回归问题实际应用案例
- 08-05用Python实现机器学习算法之k-决策树算法并做注释说明
- 08-05Python机器学习之决策树分类详解,保姆级教学!
- 08-05用Python进行机器学习(5)-决策树
- 08-05决策树算法原理与Python实现
- 08-05python学习笔记 1.常见的数据类型
- 08-05从进阶语法到实战应用:Python中级修炼指南
- 08-05Python 面试问题:运算符
- 最近发表
- 标签列表
-
- python中类 (31)
- python 迭代 (34)
- python 小写 (35)
- python怎么输出 (33)
- python 日志 (35)
- python语音 (31)
- python 工程师 (34)
- python3 安装 (31)
- python音乐 (31)
- 安卓 python (32)
- python 小游戏 (32)
- python 安卓 (31)
- python聚类 (34)
- python向量 (31)
- python大全 (31)
- python次方 (33)
- python桌面 (32)
- python总结 (34)
- python浏览器 (32)
- python 请求 (32)
- python 前端 (32)
- python验证码 (33)
- python 题目 (32)
- python 文件写 (33)
- python中的用法 (32)