'''
异常 :
1、一些内置的异常类 基本上都是Exception的子类(派生出来的)
2、异常的传递 : 从产生异常的地方开始传递到调用异常的地方 如果一直没有处理异常 会一直传递到主函数 然后停止程序并报出异常信息
3、try: except: else: finally: 捕获异常并处理
4、主动抛出异常 :比如输入密码时要求密码长度超过8位
'''
# 异常 异常的传递 捕获异常
def demo1():
num = int(input('please input a integer:'))
return 8 / num
def demo2():
return demo1()
try: # 捕获会产生异常的地方
print(demo2())
except ValueError: # 匹配异常类型
print('input a right integer')
except ZeroDivisionError: # 匹配异常类型
print('division by 0')
except Exception as result: # 当前面的异常都没有捕获到异常时 其他未知异常都会被捕获 并且这个异常类型会被存储在result中
print(result)
else: # 当没有异常发生时会执行的代码
print('sucessful!')
finally: # 不管有没有异常发生时都会执行的代码
print('here finally')
print('-'*50) # 不管有没有异常发生时都会执行的代码
# 主动抛出异常
def PassWord_input():
pwd = input('input password:')
_length = len(pwd)
if _length < 8:
ex = Exception('密码长度短于8位') # 主动抛出异常分两步 : 1、创建一个Exception('XXX')的对象 XXX为异常提示信息
raise ex # 2、raise抛出这个对象(异常对象)
else:
print('输入成功')
print('test raise') # raise相当于return 执行到就会停止
while True: # 可以一直try捕获异常 直到没有发生异常后else:break跳出
try:
PassWord_input()
except Exception as res:
print(res)
else:
break
print('*'*50)
# 禁止异常上下文
# raise ValueError from None 自定义异常上下文
# 一箭双雕(一个except 捕获多个异常) : 元组
# except (TypeError, ValueError, NameError):
# 警告
from warnings import warn
warn('i am an apple')