什么是异常:异常是错误发生的信号,一旦程序出错,并且程序没有处理这个错误,那就会抛出异常,并且程序的运行随之终止。
假设我们有个a.txt文件,我们来读取文件内容:
try:
f = open('a.txt', 'r', encoding='utf-8')
while True:
print(next(f)) # f是迭代器类型,所以可以用next来访问
except StopIteration: # 异常处理,这里指定异常的情况只能处理指定的异常
print('出错啦') # 可以定义异常情况的处理
f.close()
我们用代码例来说明异常处理的使用方法
# 多分支:被检测的代码块抛出的异常有多种可能性,并且需要针对每一种异常类型都定制专门的处理逻辑
# 万能异常:Exception
# else 处理:else内的代码在没有异常的时候执行
# finally 处理:异常处理之后执行,即使发生了想定以外的异常,报错了,也依然会执行
# try...except 只会捕捉第一个发生的异常,并且不会执行try内部异常语句下面的语句
try:
print('---1---')
# name # NameError,所以try内部的代码只能执行到这里
print('---2---')
li = [1,2,3]
# li[100] # IndexError
print('---3---')
# 只能处理 except 指定的异常,其他异常依然会报错
except NameError as e: # 把异常信息传给 e
print('error:', e) # 输出异常信息
# 如果要处理多种,可以再继续添加 except 语句。
except IndexError as e:
print('error:', e)
except Exception as e: # 万能异常,这样可以处理其他异常
print('error:', e)
else: # else内的代码在没有异常的时候执行
print('在没有发生异常的时候处理')
finally: # 异常处理之后执行
print('不管代码有无异常发生,都会执行')
class People:
def __init__(self, name, age):
if not isinstance(name, str):
raise TypeError('名字必须是str类型') # 抛出异常
if not isinstance(age, int):
raise TypeError('年龄必须是int类型') # 抛出异常
self.name = name
self.age = age
p1 = People('aaa', 12)
info = {}
info['name'] = 'aaa'
info['age'] = 18
# if 'name' not in info:
# raise KeyError('必须有name这个key')
# if 'age' not in info:
# raise KeyError('必须有age这个key')
# python提供断言的功能 assert 。如果不满足条件就会抛出 AssertionError 异常
assert ('name' in info) and ('age' in info) # 这一行就相当于上面的两个if语句
if info['name'] == 'aaa' and info['age'] > 10:
print('Enter')
python默认带的异常类型都不能满足要求的时候,我们可以自定义异常类型
class MyException(BaseException): # 大部分要沿用python提供的,所以继承BaseException
def __init__(self, msg):
super(MyException, self).__init__()
self.msg = msg # 输入给异常的参数
def __str__(self): # 异常的value 需要用__str__方法来输出
return '<%s>' % self.msg
raise MyException('我自己的异常类型')
第七章 面向对象(14):异常处理:try...except
原文:https://www.cnblogs.com/py-xiaoqiang/p/11210491.html