异常
程序中出现异常程序就会终止,如果这个错误无关紧要,可以捕获异常,让程序继续运行下去,这时候就需要异常处理
关键词:try,except ,else,finally
try:
代码块(可能出错的语句)
except 异常类型 as 异常名:
代码块(出错以后的处理方式)
except 异常类型 as 异常名:
代码块(出错以后的处理方式)
....
else:
代码块(没出错误时执行的语句)
finally :
代码块(无论出不出现异常都会执行)
# 异常
# 程序运行中,一旦出现异常会导致程序立即终止,异常以后的代码全部都不会执行!
# 处理异常:
# try:
# 代码块(可能出错的语句)
# except 异常类型 as 异常名:
# 代码块(出错以后的处理方式)
# except 异常类型 as 异常名:
# 代码块(出错以后的处理方式)
# ....
# else:
# 代码块(没出错误时执行的语句)
# finally :
# 代码块(无论出不出现异常都会执行)
# try必须有,else有没有都可以
# except和finally至少有一个
try:
print(10/0)
except:
print('程序出错了。。')
else:
print('程序正常执行。。')
print('- '*40)
# 异常的传播
# 当函数中出现异常时,如果在函数中对异常进行了处理,则异常不会再继续传播
# 如果没有对异常处理,则异常会继续向函数调用处传播
# 当程序运行过程出现异常以后,所有异常信息会被保存一个专门的异常对象中,
# 而异常传播时,实际上就是异常对象抛给了调用处
def fn1( ):
print('hello fn1')
print(10/0)
def fn2( ):
print('hello fn2')
fn1( )
def fn3( ):
print('hello fn3')
fn2( )
fn3( )
异常处理
except 异常类型 as 异常名:
except 异常类型 可以捕获该类型的异常,as xx 将错误信息存在xx中
raise 异常类型 抛出异常
print('异常出现前~')
o = [ ]
try:
print(c)
a + 'ku'
o[9]
print( 10/0 )
except NameError as e:
# 可以在异常类后面跟着一个 as xx ,此时 xx 就是异常对象里的错误信息
# e 里面就是 name 'c' is not defined
print('出现了 NameError 错误',e,type(e) )
except ZeroDivisionError:
print('出现了 ZeroDivisionError 错误')
except Exception:
# Exception 是所有异常的父类,它会捕获所有异常,效果和直接用 except: 一样
print('出现其他异常')
# 类似于 else if,else 的结构
else :
print('没出错误时执行的语句')
finally :
print('无论出不出现异常 finally 都会执行')
print('异常出现后~')
print('- '*40)
# 抛出异常(raise)
# 自定义异常类,只需要创建一个类继承Except即可:
class MyError(Exception) :
pass
def add(a,b) :
# 如果a和b中有负数,就抛出异常
if a<0 or b<0 :
# raise 用于向外部抛出异常,后面可以跟一个异常类,或者异常类的实例
# raise Exception
# raise Exception('两个参数中不能有负数')
# Exception: 两个参数中不能有负数
raise MyError('自定义异常 MyError,两个参数中不能有负数')
# __main__.MyError: 自定义异常,两个参数中不能有负数
# return None
# if 也可以做到类似的效果,但抛出异常具有强制作用,不改错误程序就运行不下去
r = a+b
return r
print( add(-1,3) )