异常
一、了解异常
当程序执行之后,解释器会检测程序中是否有错误,如果遇到错误,解释器会给出错误类型和错误信息,这个类型和信息在Python中叫做”异常“
异常的特点:当出现之后,解释器立即停止解释,异常代码之后的代码不会执行。在工程中,即使代码报错,也需要执行后续代码,这时就需要对异常进行处理,处理过程叫做”捕获异常“
n1 = int(input('请输入一个整数:')) # 可能报错的代码'1.1' 不能转int类型
print('asdfasdfasd')
print(1 / n1) # 可能报错。ZeroDivisionError: division by zero
二、异常的使用
2.1 简单体验
- 语法
try:
可能报错的代码
except:
出现异常之后需要做的处理
- 代码演示
try:
print(1 / 0) # 一定会报错
except:
print('出现异常之后进行处理')
2.2 捕获指定异常
2.2.1 捕获单个异常
- 语法
try:
可能出现异常的代码
except 指定异常的类型:
对异常进行处理
- 代码
try:
int(input('请输入整数:')) # 异常类型:ValueError
print(1 / 0) # 异常类型:ZeroDivisionError
except ValueError: # 表示捕获指定的异常,如果try抛出的异常不在except之后定义,则捕获失败
print('处理异常')
print('后续代码')
2.2.2 捕获多个指定异常
- 语法
try:
可能出现异常的代码
except (异常类型1, 异常类型2, ...,异常类型n):
对异常进行处理
- 代码
try:
n = int(input('请输入整数:'))
print(1 / n) # ZeroDivisionError
except (ValueError, ZeroDivisionError): # 表示捕获指定的异常,如果try抛出的异常不在except之后定义, 则捕获失败
print('处理异常')
print('后续代码')
2.2.3 查看异常信息
- 语法
try:
可能出现异常的代码
except 异常类型 as 异常信息:
对异常进行处理
- 代码
try:
print(1 / 0)
except ZeroDivisionError as e: # 将异常信息保存变量e中
print(e)
2.2.4 捕获Exception异常
- 语法
try:
可能出现异常的代码
except Exception as e: # Exception是代码级异常的基类
处理异常
- 代码
try:
n = int(input('请输入整数:'))
print(1 / n)
except Exception as e: # 将异常信息保存变量e中
print(e)
通过
Exception
来捕获所有代码级的异常。
2.2.5 捕获BaseException异常
- 语法
try:
可能出现异常的代码
except BaseException as e: # BaseException表示所有异常的基类
处理异常
- 代码
import time
try:
time.sleep(10)
except BaseException as e: # 将异常信息保存变量e中
print(e)
2.3 else
当
try
中的代码没有出现异常,则执行else
中的代码
- 语法
try:
可能出现异常的代码
except:
处理异常
else:
没有异常时执行的代码
- 代码
try:
f = open('test.txt')
except Exception as e:
print('except')
f = open('test.txt', 'w')
f.write('adsfsadf')
else:
print('else')
print(f.read())
f.close()
2.4 finally
无论是否出现异常,都会执行
finally
中的代码,一般用于关闭数据库连接、数据库的事务提交
- 语法
try:
f = open('test.txt')
except Exception as e:
print('except')
f = open('test.txt', 'w')
f.write('ABC')
else:
print('else')
print(f.read())
finally:
print('finally')
f.close()
三、异常的传递
- 函数调用时的异常处理
def func1():
print('异常代码之前')
print(1 / 0)
print('异常代码之后')
def func2():
print('调用func1之前')
func1()
print('调用func1之后')
# 第一种:在调用处处理异常
def func1():
print('异常代码之前')
print(1 / 0)
print('异常代码之后')
def func2():
print('调用func1之前')
try:
func1()
except:
pass
print('调用func1之后')
# 第二种:在异常源码处处理
def func1():
print('异常代码之前')
try:
print(1 / 0)
except:
pass
print('异常代码之后')
def func2():
print('调用func1之前')
func1()
print('调用func1之后')
try
的嵌套
import time
try:
f = open('test.txt')
try:
time.sleep(10)
except BaseException as e: # 当处理完异常,不会异常传递到外层的try
print('系统中断', e)
except:
print('文件不存在!')
else:
print('未出现异常')
print('程序结束')
四、自定义异常
4.1 自定义异常的步骤
- 创建异常类:
- 创建一个异常类,这个类必须继承常用错误的基类
Exception
- 创建一个
__str__
,通过这个方法return
异常信息
- 抛出异常:
raise 自定义异常的实例对象
# 自定义异常类
class MyError(Exception):
def __str__(self):
return '异常信息'
# 抛出自定义异常
raise MyError()
4.2 案例
""" 练习:
1. 提示用户输入一个整数,
2. 如果输入的是奇数,则抛出异常
3. 处理这个异常
"""
class MyError(Exception):
def __init__(self, n):
self.n = n
def __str__(self):
# 你输入的是xxxx,它是一个奇数
return f'你输入的是{self.n},它是一个奇数!'
try:
num_ = int(input('请输入一个偶数:'))
if num_ % 2: # 如果num_为奇数,则抛出异常
raise MyError(num_)
except Exception as e:
print(e)
else:
print('输入正确')