个人主页:丷从心
系列专栏:Python基础
学习指南:Python学习指南
什么是异常
- 运行如下程序
print(num)
Traceback (most recent call last):
File "C:/Users/FOLLOW_MY_HEART/Desktop/Python基础/【Python基础】异常/test.py", line 1, in <module>
print(num)
NameError: name 'num' is not defined
- 程序运行出现错误时就是产生了异常,打印报错信息
- 异常是
Python
中的对象,表示一个错误,当程序产生异常时,需要对异常进行捕获和处理,否则程序会终止运行 - 每一个异常都是异常类的实例,可以被捕获,使得错误可以被及时处理而不会使整个程序终止
异常处理
try...except...
语句
格式
try:
可能会产生异常的代码, 如果产生异常, try 语句会对异常进行捕获
except 异常类型:
try 语句捕获到异常时, except 语句会对异常进行处理
示例
不使用异常处理时
print(1 / 0)
print('产生异常时, 程序在异常处终止, 无法运行到这里...')
Traceback (most recent call last):
File "C:/Users/FOLLOW_MY_HEART/Desktop/Python基础/【Python基础】异常/test.py", line 1, in <module>
print(1 / 0)
ZeroDivisionError: division by zero
- 当我们使用 0 0 0作为除数时会产生
ZeroDivisionError
除零异常,如果没有对异常进行捕获和处理,那么整个程序就会终止,下面的代码无法被执行
使用异常处理时
try:
print(1 / 0)
except ZeroDivisionError as e:
print(e)
print('除数不能为 0')
print('即使产生异常, 依然能够运行到这里...')
division by zero
除数不能为 0
即使产生异常, 依然能够运行到这里...
- 使用异常处理时,产生
ZeroDivisionError
异常时,try
语句会对异常进行捕获,并跳转到except
语句,然后通过except
语句对异常进行处理,此时程序并不会因为异常而终止,能够正常执行下面的代码 as
关键字用于将异常对象赋值给一个变量,可以使用变量e
打印异常信息或进行其他操作
抛出异常
Python
中使用raise
关键字抛出异常,可以使用异常类或实例参数调用raise
语句抛出异常,使用异常类抛出异常时会自动创建一个实例
示例
raise Exception
Traceback (most recent call last):
File "C:/Users/FOLLOW_MY_HEART/Desktop/Python基础/【Python基础】异常/test.py", line 1, in <module>
raise Exception
Exception
Exception
是所有异常类的基类,没有相关错误信息
raise NameError('This is NameError')
Traceback (most recent call last):
File "C:/Users/FOLLOW_MY_HEART/Desktop/Python基础/【Python基础】异常/test.py", line 1, in <module>
raise NameError('This is NameError')
NameError: This is NameError
- 上述代码中,在异常类实例化时自定义了错误信息,产生异常时会打印这些错误信息
- 如果只是想知道是否产生了异常,而不想进行处理,使用
raise
就可以再次将异常抛出
try:
raise NameError('This is NameError')
except NameError:
print('产生了 NameError 异常')
raise
产生了 NameError 异常
Traceback (most recent call last):
File "C:/Users/FOLLOW_MY_HEART/Desktop/Python基础/【Python基础】异常/test.py", line 2, in <module>
raise NameError('This is NameError')
NameError: This is NameError
- 可以看到,执行了
print('产生了 NameError 异常')
后,异常被再次抛出
else
语句
- 没有产生异常时需要执行的代码放在
else
语句中
格式
try:
可能会产生异常的代码, 如果产生异常, try 语句会对异常进行捕获
except 异常类型:
try 语句捕获到异常时, except 语句会对异常进行处理
else:
没有产生异常时, 需要执行的代码
示例
try:
print(1 / 1)
except ZeroDivisionError as e:
print(e)
print('除数不能为 0')
else:
print('没有产生异常时, 会运行到这里...')
1.0
没有产生异常时会运行到这里...
finally
语句
- 无论程序是否产生异常,都会执行的代码放在
finally
语句中 finally
不能单独使用,需要搭配try
语句使用
格式
try:
可能会产生异常的代码, 如果产生异常, try 语句会对异常进行捕获
except 异常类型:
try 语句捕获到异常时, except 语句会对异常进行处理
else:
没有产生异常时, 需要执行的代码
finally:
无论是否产生异常,都会执行的代码
示例
try:
print(num)
except ZeroDivisionError as e:
print(e)
print('除数不能为 0')
else:
print('没有产生异常时, 会运行到这里...')
finally:
print('无论是否产生异常, 都会运行到这里...')
无论是否产生异常, 都会运行到这里...
Traceback (most recent call last):
File "C:/Users/FOLLOW_MY_HEART/Desktop/Python基础/【Python基础】异常/test.py", line 2, in <module>
print(num)
NameError: name 'num' is not defined
- 上述代码中,
print(num)
是NameError
异常,而没有定义对NameError
异常的处理,所以仍然会产生异常,在程序终止之前会执行finally
语句中的代码,之后程序才会终止 - 可以定义对多种异常的处理
try:
print(num)
except ZeroDivisionError as e:
print(e)
print('除数不能为 0')
except NameError as e:
print(e)
print('变量需要定义后再使用')
else:
print('没有产生异常时, 会运行到这里...')
finally:
print('无论是否产生异常, 都会运行到这里...')
name 'num' is not defined
变量需要定义后再使用
无论是否产生异常, 都会运行到这里...
finally
语句的作用
finally
语句在关闭文件或数据库连接时非常有用,将分别在文件读写章节和数据库操纵章节进行介绍
自定义异常类
- 自定义异常类需要继承
Exception
异常基类
示例
class PasswordError(Exception):
def __str__(self):
return '密码错误...'
def __repr__(self):
return '密码错误...'
name = input('请输入用户名: ')
password = input('请输入密码: ')
local_name = 'follow__my_heart'
local_password = 'admin'
try:
if name != local_name or password != local_password:
raise PasswordError
except PasswordError as e:
print(e)
else:
print('密码正确, 欢迎...')
请输入用户名: follow__my_heart
请输入密码: 123456
密码错误...
请输入用户名: follow__my_heart
请输入密码: admin
密码正确, 欢迎...