什么是异常:
分两部分: 第一部分是错误的追溯,告诉我们错误的位置,哪个文件,哪一行
第二部分是错误类型:具体的错误内容,具体的提示
错误类型是有限的
什么时候容易出异常:
当你要处理的内容不确定的时候
有用户参与
有外界数据接入,从文件中读,从网络上获取

当有多行报错的时候是为什么?
在嵌套调用过程中,内部的代码出了问题,外部所有的调用的地方都成为报错追溯信息的一部分

怎么解决:
从下往上找,首先找到你写的代码,出错的那一行
看看能不能看出问题
如果自己看不出,就把报错的最后一行,错误类型和详细提示贴到百度,结合报错的那一行进行拍错解决

异常处理的几种情况:******
try:
pass
expect 错误:
pass

可以有多个except分支,从上向下报错的代码只要找到一个和报错类型相符的分支就执行这个分支中的代码,然后直接退出分支
如果找不到能处理和报错类型相同的分支,会一直往下走,最后还是没找到会报错

单分支
多分支
单分支合并
except(错误一,错误二)
万能异常: 万能异常应该永远放在异常处理的最下面
try:
pass
except Exception: (只写except也可以)
pass

else分支:
try:
pass
expect 错误:
pass
expect 错误:
pass
else: 当try中的代码不发生异常的时候走else分支
print()



finally分支: 如果return遇到finally的时候,.会先执行finall,再执行return
try也可以直接跟finally一起使用,例如在操作文件的时候,无论会不会报错,都是要关闭文件的,所以需要用到finally进行关闭文件
try一起使用的时候,即使遇到报错,程序结束,也会先执行finally中的代码,然后再结束程序
finally用来回收一些操作系统的资源:数据库连接,打开的文件句柄,网络连接

try:
pass
expect 错误:
pass
expect 错误:
pass
else: 当try中的代码不发生异常的时候走else分支
print()
finally: 即使return,也会先执行finally中的代码
print()

# 异常处理的几种情况
# try ... except
# try ... except ... else
# try ... finally
# try ... except ... finally
# try ... except ... else ... finally



主动抛出异常:
raise...
断言:
assert... 后面只能接收一个布尔值