【Python语言基础】22、异常处理
文章目录
- 1. 异常
- 1.1 简介
- 1.2 为什么需要异常处理
- 2. 基本语法
- 2.1 各部分详解
- 3. 异常处理流程
- 3.1 执行try代码块
- 3.2 异常发生检查
- 3.3 异常捕获与匹配
- 3.4 执行匹配的 except 代码块
- 3.5 执行 else 代码块(可选)
- 3.6 执行 finally 代码块(可选)
- 4. 自定义异常对象
- 5. 异常处理最佳实践
在 Python 里,异常处理是一种很重要的机制,它能帮助你处理程序运行时可能出现的错误,让程序更加健壮、稳定。
1. 异常
1.1 简介
在程序运行时,要是出现了错误,就会引发异常。
比如你尝试打开一个不存在的文件,或者进行除法运算时除数为零,这些情况都会触发相应的异常。
Python 有很多内置的异常类型,像 ZeroDivisionError(除零错误)、FileNotFoundError(文件未找到错误)、TypeError(类型错误)等。
1.2 为什么需要异常处理
异常处理可以让程序在遇到错误时不会直接崩溃,而是按照你预先设定的方式进行处理。
这样能增强程序的稳定性和可靠性,同时也方便你调试和维护代码。
2. 基本语法
Python 使用 try、except、else 和 finally 语句来进行异常处理,
基本结构如下:
try:# 可能会引发异常的代码块result = 10 / 0 # 这里会引发 ZeroDivisionError
except ZeroDivisionError:# 当捕获到 ZeroDivisionError 异常时执行的代码块print("除数不能为零!")
else:# 如果 try 代码块中没有引发异常,则执行此代码块print("没有发生异常,结果是:", result)
finally:# 无论是否发生异常,都会执行此代码块print("这是 finally 代码块,总会被执行。")
2.1 各部分详解
-
try 块 : 包含可能会引发异常的代码。Python 会尝试执行这个代码块里的语句。
-
except 块:用于捕获和处理特定类型的异常。你可以指定要捕获的异常类型,当 try 块中引发了指定类型的异常时,就会执行对应的 except 块中的代码。你也可以有多个 except 块来捕获不同类型的异常。
try:num = int("abc") # 这里会引发 ValueError
except ZeroDivisionError:print("捕获到除零错误!")
except ValueError:print("捕获到值错误,输入不是有效的整数!")
-
else 块:
如果 try 块中的代码没有引发任何异常,就会执行 else 块中的代码。它通常用于放置那些只有在没有异常发生时才需要执行的代码。 -
finally 块:
无论 try 块中是否发生异常,finally 块中的代码都会被执行。这个代码块常用于释放资源,比如关闭文件、数据库连接等。
3. 异常处理流程
Python 中异常处理的流程遵循一套固定的规则,了解这个流程有助于你更好地运用异常处理机制来编写稳定的代码。
3.1 执行try代码块
程序开始执行 try 代码块中的语句。这部分代码是你认为可能会引发异常的代码区域。例如
try:num1 = 10num2 = 0result = num1 / num2 # 这里会引发 ZeroDivisionError 异常print(result)
except ZeroDivisionError:print("除数不能为零!")
在上述代码中,程序会先执行 try 块里的 num1 / num2 操作。
3.2 异常发生检查
在执行 try 代码块的过程中,Python 会持续检查是否有异常发生。
如果没有异常发生,try 代码块会正常执行完毕,接着会根据情况执行 else 代码块(如果存在),最后执行 finally 代码块(如果存在)。
3.3 异常捕获与匹配
若在 try 代码块执行过程中发生了异常,Python 会立即停止 try 代码块中后续语句的执行,然后开始查找与之匹配的 except 代码块。
它会依次检查每个 except 子句声明的异常类型,看是否与当前发生的异常类型相符。
- 单一异常捕获
try:num = int("abc") # 引发 ValueError 异常
except ValueError:print("输入不是有效的整数!")
在这个例子中,当 int(“abc”) 引发 ValueError 异常时,Python 会找到与之匹配的 except ValueError 代码块并执行其中的语句。
- 多个异常捕获
try:num1 = 10num2 = 0result = num1 / num2 # 引发 ZeroDivisionError 异常
except ValueError:print("输入不是有效的整数!")
except ZeroDivisionError:print("除数不能为零!")
这里,由于发生的是 ZeroDivisionError 异常,Python 会跳过 except ValueError 代码块,执行 except ZeroDivisionError 代码块中的语句。
3.4 执行匹配的 except 代码块
一旦找到匹配的 except 代码块,Python 就会执行该代码块中的语句。
在执行完这个 except 代码块后,程序会跳过其他 except 代码块,继续执行 finally 代码块(如果存在)。
3.5 执行 else 代码块(可选)
如果 try 代码块中没有发生异常,程序会执行 else 代码块(如果存在)。
else 代码块通常用于放置那些只有在没有异常发生时才需要执行的代码。
try:num = 10result = num * 2
except ValueError:print("输入不是有效的整数!")
else:print("计算结果是:", result)
在这个例子中,因为 try 块中没有发生异常,所以会执行 else 代码块并打印计算结果
3.6 执行 finally 代码块(可选)
无论 try 代码块中是否发生异常,也无论异常是否被捕获,finally 代码块中的语句都会被执行。
finally 代码块常用于释放资源,如关闭文件、数据库连接等。
try:file = open("test.txt", "r")content = file.read()print(content)
except FileNotFoundError:print("文件未找到!")
finally:if 'file' in locals():file.close()
在这个例子中,无论是否成功打开文件并读取内容,finally 代码块都会尝试关闭文件,确保资源被正确释放。
综上所述,Python 异常处理的流程就是先执行 try 代码块,检查是否有异常发生,若有则查找匹配的 except 代码块并执行,接着根据情况执行 else 代码块,最后执行 finally 代码块
4. 自定义异常对象
除了使用 Python 内置的异常类型,还可以自定义异常。自定义异常通常是通过继承 Exception 类来实现的。
class MyCustomError(Exception):passtry:raise MyCustomError("这是一个自定义异常!")
except MyCustomError as e:print(e)
在这个例子中,我们定义了一个名为 MyCustomError 的自定义异常类,然后使用 raise 语句手动引发这个异常。
5. 异常处理最佳实践
- 精确捕获异常:尽量明确指定要捕获的异常类型,避免使用空的 except 语句捕获所有异常,这样能让你更清楚地知道程序中出现了什么问题。
- 记录异常信息:在捕获异常时,最好记录下异常的详细信息,比如异常类型、异常消息等,方便后续调试。
- 释放资源:使用 finally 块确保在程序结束时释放资源,避免资源泄漏。
通过合理使用异常处理,可以让 Python 程序更加健壮,能够更好地应对各种意外情况。