【Python基础】异常-LMLPHP

个人主页:丷从心

系列专栏:Python基础

学习指南:Python学习指南

【Python基础】异常-LMLPHP


什么是异常

  • 运行如下程序
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
密码正确, 欢迎...

01-04 12:49