目录
Python基础文章系列
Python 基础 (一)Python基本认识与环境搭建 | Python 基础 (一)Python基本认识与环境搭建 |
---|---|
Python 基础 (二)Python变量与基本数据类型 | Python 基础 (二)Python变量与基本数据类型 |
Python 基础 (三)Python基本语句与基本运算 | Python 基础 (三)Python基本语句与基本运算 |
Python 基础 (四)Python函数 | Python 基础 (四)Python函数 |
Python 基础 (五)Python包与模块 | Python 基础 (五)Python包与模块 |
Python 基础 (六)Python的文件模块 | Python 基础 (六)Python的文件模块 |
Python 基础 (七)Python的异常处理机制 | Python 基础 (七)Python的异常处理机制 |
Python 基础 (八)Python的类与对象 | Python 基础 (八)Python的类与对象 |
Python 基础 (九)Python的内置模块 | Python 基础 (九)Python的内置模块 |
Python 基础 (十)Python实现简单的图书管理系统 | Python 基础 (十)Python实现简单的图书管理系统 |
4.7 错误与异常
作为 Python 初学者,在刚学习 Python 编程时,经常会看到一些报错信息,在前面我们没有提及,这章节我们会专门介绍。
Python 有两种错误很容易辨认:语法错误和异常。
Python assert(断言)用于判断一个表达式,在表达式条件为 false 的时候触发异常。
4.7.1 语法错误
Python 的语法错误或者称之为解析错,是初学者经常碰到的,如下实例
# ---encoding:utf-8---
# @Time : 2023/9/3 10:11
# @Author : Darwin_Bossen
# @Email :3139066125@qq.com
# @Site : 语法错误
# @File : ErrorTest.py
if __name__ == '__main__':
while True print('Hello world')
SyntaxError: invalid syntax
这个例子中,函数 print() 被检查到有错误,是它前面缺少了一个冒号 : 。
语法分析器指出了出错的一行,并且在最先找到的错误的位置标记了一个小小的箭头。
4.7.2 异常
即便 Python 程序的语法是正确的,在运行它的时候,也有可能发生错误。运行期检测到的错误被称为异常。
# ---encoding:utf-8---
# @Time : 2023/9/3 10:13
# @Author : Darwin_Bossen
# @Email :3139066125@qq.com
# @Site : 常见异常
# @File : ErrorTest02.py
if __name__ == '__main__':
# 算术异常
print(10/0)
# 索引异常
arr=[1,2,3,4,5,6,7,8,9,10]
print(arr[10])
# 键异常
dict={"name":"Darwin","age":18}
print(dict('hhj'))
# 类型异常
print(10+"hello")
# 值异常
print(int("hello"))
# 文件异常
f=open("hello.txt","r")
print(f.read())
4.7.3 异常处理
try/except
异常捕捉可以使用 try/except 语句
# ---encoding:utf-8---
# @Time : 2023/9/3 10:17
# @Author : Darwin_Bossen
# @Email :3139066125@qq.com
# @Site : 异常处理
# @File : ErrorTest03.py
if __name__ == '__main__':
try:
print(10/0)
except Exception as e:
print(e)
finally:
print("程序执行完毕")
try 语句按照如下方式工作;
- 首先,执行 try 子句(在关键字 try 和关键字 except 之间的语句)。
- 如果没有异常发生,忽略 except 子句,try 子句执行后结束。
- 如果在执行 try 子句的过程中发生了异常,那么 try 子句余下的部分将被忽略。如果异常的类型和 except 之后的名称相符,那么对应的 except 子句将被执行。
- 如果一个异常没有与任何的 except 匹配,那么这个异常将会传递给上层的 try 中。
try/except…else
try/except 语句还有一个可选的 else 子句,如果使用这个子句,那么必须放在所有的 except 子句之后,else 子句将在 try 子句没有发生任何异常的时候执行。
# ---encoding:utf-8---
# @Time : 2023/9/3 10:19
# @Author : Darwin_Bossen
# @Email :3139066125@qq.com
# @Site : 异常处理: try/except...else
# @File : ErrorTest04.py
if __name__ == '__main__':
try:
print(10/1)
except Exception as e:
print(e)
else:
print("程序执行完毕")
try-finally 语句
try-finally 语句无论是否发生异常都将执行最后的代码
# ---encoding:utf-8---
# @Time : 2023/9/3 10:21
# @Author : Darwin_Bossen
# @Email :3139066125@qq.com
# @Site : try-finally
# @File : ErrorTest05.py
if __name__ == '__main__':
# 读取文件
try:
f = open("hello.txt", "r")
print(f.read())
except Exception as e:
print(e)
finally:
if f:
f.close()
print("程序执行完毕")
4.7.4 抛出异常
Python 使用 raise 语句抛出一个指定的异常。
# ---encoding:utf-8---
# @Time : 2023/9/3 10:24
# @Author : Darwin_Bossen
# @Email :3139066125@qq.com
# @Site : raise 异常
# @File : ErrorTest06.py
if __name__ == '__main__':
try:
print(10/0)
except Exception as e:
raise e
finally:
print("程序执行完毕")
4.7.5 用户自定义异常
- 你可以通过创建一个新的异常类来拥有自己的异常。异常类继承自 Exception 类,可以直接继承,或者间接继承
# ---encoding:utf-8---
# @Time : 2023/9/3 10:26
# @Author : Darwin_Bossen
# @Email :3139066125@qq.com
# @Site : 自定义异常
# @File : ErrorTest07.py
# 自定义异常
class MyException(Exception):
def __init__(self, msg):
self.msg = msg
def __str__(self):
return self.msg
if __name__ == '__main__':
try:
raise MyException("自定义异常")
except MyException as e:
print(e)
finally:
print("程序执行完毕")
4.7.6 总结
Python的异常机制是一种处理程序中出现错误的方式。异常是在程序执行过程中检测到的错误或异常情况,它们可以阻止程序正常运行。Python使用try
和except
语句来处理异常,以下是异常处理的基本结构:
try:
# 可能会引发异常的代码
result = 10 / 0 # 这里故意引发了一个除零异常
except ZeroDivisionError:
# 处理特定类型的异常
print("除零错误发生了!")
except Exception as e:
# 处理其他类型的异常,并可以访问异常对象
print(f"发生了异常:{e}")
else:
# 如果没有异常发生,执行此块
print("没有发生异常。")
finally:
# 无论是否发生异常,都会执行此块
print("无论如何都会执行的代码块。")
上述代码示例中,程序尝试执行可能引发异常的代码块(在try
块内)。如果异常发生,程序会跳转到匹配的except
块进行处理。如果没有异常发生,将执行else
块。最后,不管是否发生异常,都会执行finally
块。
Python提供了多种内置异常类型,例如ZeroDivisionError
(除零异常)、TypeError
(类型错误)、ValueError
(值错误)等。你可以根据需要捕获和处理这些异常,或者创建自定义异常类以处理特定情况下的异常。