异常

#异常一 :可以预知的异常 可以用if条件避免

#游戏猜年纪:
AGE = 25
age = input('>>>')
if age.isdecimal():
if int(age) > AGE:
print('答对啦!')

#异常二,不可以预知的异常,用try 和 except接收
try:
f = open('a.txt', 'r', encoding='utf-8')
print(next(f), end = ' ')
print(next(f), end = ' ')
print(next(f), end = ' ')
print(next(f), end = ' ')
print(next(f), end = ' ')
except StopIteration:
print('出错啦!')
print('哈哈哈')
print('哈哈哈')
print('哈哈哈')

#我们需要注意的是如果你捕捉的异常类型和程序要抛出的异常类型不一样,这时这个异常还是会照样抛出来

#多分支异常:多分支异常用的场景常在我们抛出的异常需要明确区分
try:
print(1)
name
print(2)
li = []
li[3]
print(3)
d = {}
d['name']
except NameError as e:
print('===', e)
except IndexError as e:
print('===', e)
except KeyError as e:
print('===', e)

#万能异常:万能异常是Exception 用于场景是我们没有对多种异常没有明确区分的情况下,单需要接收异常而已


#其他异常
try:
print(1)
#name
print(2)
li = []
#li[3]
print(3)
d = {}
#d['name']
except NameError as e:
print('===', e)
except IndexError as e:
print('===', e)
except KeyError as e:
print('===', e)
else:
print('程序没有异常,我会正常运行!')
finally:
print('有没有异常我都运行!')

try:
f = open('a.txt', 'r', encoding='utf-8')
print(next(f), end = ' ')
print(next(f), end = ' ')
print(next(f), end = ' ')
print(next(f), end = ' ')
print(next(f), end = ' ')
print(next(f), end = ' ')

print(next(f)) #这个会报错,因为文件中只有四行
except Exception:
f.close()


#raise主动抛出异常:
class People:
def __init__(self, name, age):
if not isinstance(name, str):
raise TypeError('name必须是str')
self.name = name
if not isinstance(age, int):
raise TypeError('age必须是int')
self.age = age
obj = People(56, '25')

#此处我们把name 传入 的是int类型 age传入的是str类型 , 这里程序执行不到age那里 直接在name那里就开始抛出异常了





#断言assert;
info = {}
info['name'] = 'egon'
info['age'] = 25
#1自定义断言法:
if not 'name' in info:
raise TypeError('没有name这个key')
if not 'age' in info:
raise TypeError('没有name这个key')
#2骚操作断言法:
assert ('name' in info) and ('age' in info)
#操作2是断言法的使用是不是更加高端呢?

#执行判断语句if info['name'] == 'egon' and info['age'] > 10: print('Welcome to henan')


#自定义异常类型:
class MyExcption(BaseException):
def __init__(self, msg):
self.msg = msg
def __str__(self):
return '<%s>'%self.msg
raise MyExcption('我是自定义异常')
#raise不但输出追溯信息和输出异常类型, 它还会去打印MyException()这个对象,所以如果想要有# #己的类型格式必须加装__str__方法返回自己的异常类型的格式



原文地址:https://www.cnblogs.com/yuexijun/p/10327954.html