异常处理

程序中难免出现错误,而错误分成两种

1.语法错误(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正)

#语法错误示范一
if

#语法错误示范二
def test:
    pass

#语法错误示范三
print(haha

语法错误

2.逻辑错误(逻辑错误)

#用户输入不完整(比如输入为空)或者输入非法(输入不是数字)
num=input(">>: ")
int(num)

#无法完成计算
res1=1/0
res2=1+'str'

逻辑错误
# 什么是异常?异常和错误的区别
# Error 语法错误 比较明显的错误 在编译代码阶段就能检测出来
# Iteration 异常 在执行代码的过程中引发的异常
# 异常发生之后的效果
# 一旦在程序中发生异常,程序就不再继续执行了
如何看报错信息
异常就是程序运行时发生错误的信号,在python中,错误触发的异常如下



最简单的异常处理
l = ['登录','注册','退出']
for i in enumerate(l,1):
    print(i[0],i[1])
try:
    num = int(input('num :'))
    print(l[num-1])
except IndexError:
    print('请输入一个数字')

多分支异常处理
l = ['登录','注册','退出']
for i in enumerate(l,1):
    print(i[0],i[1])
try:
    num = int(input('num :'))
    print(l[num-1])
except ValueError:
    print('请输入一个数字')
except IndexError:
    print('您输入的数字无效')

万能异常
try:
    name  # NameError
    dic = {}
    dic['key']
except Exception as e:  # e 变量名
    print(type(e),e,e.__traceback__.tb_lineno)

结果:<class 'NameError'> name 'name' is not defined 581

万能异常和其他分支合作:万能异常永远放在所有except的最后.
try:
    name
    [][3]
    import a
except NameError:pass
except IndexError:pass
except Exception:pass

异常处理的其他机制
try:
    name
    [][3]
except IndexError:print('index error')
except NameError:print('name error')

try:
    name
    [][3]
except (IndexError,NameError)
    print("error")


try:
    name
    [][3]
except (IndexError,NameError) as e:
    print(e)
else:try中的代码正常执行 没有异常的时候会执行else中的代码
try:
    name
except NameError:
    print("name error")
else:
    print("执行了else")
结果:name error

try:
    a=1
except NameError:
    print("name error")
else:
    print("执行了else")
结果:执行了else

finally 无论如何都会执行 操作系统资源归还的工作
try: name except NameError: print("name error") else: print("执行了else") finally: print("执行了finally")
def func():
try:
f = open('file', 'w')
return f.read()
finally:
f.close()
print('执行我了')

func()

try:
f = open('file','w')
# f.read()
exit()
except:pass
# 复杂的逻辑
finally:
f.close()
print('执行我啦')
try/except
try/except/else
try/except/else/finally
try/except/finally
try/finally

主动抛异常
try:
    num = int(input('>>>'))
except Exception:
    print('在出现了异常之后做点儿什么,再让它抛异常')
    raise  # 原封不动的抛出try语句中出现的异常

自定义异常
raise NameError('这是一个name error的异常')
class CWException(Exception):
    def __init__(self,msg):
        self.msg = msg
raise CWException('这是一个什么什么错误,有什么问题')

断言
assert 布尔值
assert True
等价于if
if False:
    print(1234234)
else:
    raise AssertionError

# 尽量少用异常处理
# 能通过逻辑规避的应该代码逻辑规避掉
# 应该对某一句/几句话来进行处理
# 最后 在外层添加一个大的异常处理
 

 

 

 

posted @ 2018-08-09 21:39  chenyibai  阅读(264)  评论(0编辑  收藏  举报