异常处理
异常:Bug,出现问题了.
提前干预,提前预防.
网络请求的地方使用的最多.应急处理,预防这种问题.
如果真的产生了,不是让程序停掉,而是让程序给用户一个错误提示,跳过异常继续运行.而不是程序闪退.
预判处理:
如果某些代码很可能出错,就把这些代码放在try里面尝试性的去执行.
当try里面的代码出现异常,会直接执行对应的except的代码.except就是来拦截try里面的异常.
之前都是Python解释器来处理异常,直接报错.先在try就是有人提前帮你处理这些错误了.
except:就是一个拦截异常的作用.
就好比用户输入密码出错了,不能让程序闪退,而是应该给用户提示并继续程序的执行.实际上使用if进行预判处理也可以,但是try是专门来处理代码异常的,所以还是使用专业的处理异常的语法模块.
着重在网络请求的时候使用.
有可能正常执执行,也有可能出现异常.
except去拦截异常
基类:就是父类的意思.
异常类的基类是Exception.真正的最基类是BaseException.
代码不稳定就去try里面执行.
try后面可以跟多个except,但是只会执行某一个.
在使用try的时候,一般后面必须要跟一个except或者finally. else可以写也可以不写.
try: f = open('113.txt', 'r') # 代码出现异常了,立刻就停止运行了,不会继续往下运行. # content = f.read() # print(content) f.close() # print(b) except FileNotFoundError as error: # 拦截指定类型的异常 as 前面必须指定异常类型 print(error) except NameError as error1: # 拦截指定类型的异常 as 前面必须指定异常类型 print(error1)
# except Exception as error: # bug终结者.并且可以拿到错误信息 # print(error) # except: # bug终结者.只有当try里面的代码出错了才会执行. # print('代码出错了') # NameError 命名错误 # FileNotFoundError 文件找不到错误 else: # 如果try里面的代码没有出错,就执行else里面代码,只能1个,位置只能放到try和finally中间. print('如果try里面的代码没有出错,就执行else里面代码') finally: # 后面不能接东西.无论try里面有没有异常,都会执行finally里面的代码,只能1个.放到最后 print('无论try里面有没有异常,都会执行finally里面的代码')
try嵌套,异常冒泡抛出:
当try里面的代码出错后,try内部后续代码不会执行,而是直接执行对应的except里面的代码.
如果try里面的代码出错后,默认应该由当前try对应的except去拦截,如果拦截住,就相当于异常已经消失,如果当前try后面的except无法拦截异常,这个异常就会向外层的try传递,由外层对应的except去拦截.以此类推.一直到Python解释器为止.
异常只会向外层传递,不会向内层传递.(在函数嵌套和try嵌套里面都是这个顺序.)
try: f = open('13.txt', 'r') # 一出错就立刻跳到except里面执行 print('---------') try: content = f.read() print(content) f.close() print(a) except NameError as error1: # 这里出错,就在这里拦截 print('---:%s' % error1) except FileNotFoundError as error: print('提示:%s' % error) print('后续代码') # 如果内层函数出现异常,默认由自己处理,如果它没有处理异常,会传到外层的try
自定义异常-raise:
异常抛出的原理:
raise: 关键字 抛出. 表示抛出指定的异常实例对象
raise 抛出异常的实例对象,然后except去拦截这个异常实例对象.
能不能拦截:是要看这个错误是不是这个错误的类创建的.
拦截:判断是不是同一个类造出来的,是,就把这个异常实例对象赋值给error.
先抛出来才能拦截.
自定义异常:不用解释器提供异常类.
1> 让异常信息是中文的,让用户也能看懂.更加人性化
2> 提前干预,还没有出错之前就来对问题进行处理.
3> 简化异常处理的流程,批量抛出,一次拦截.
注意: 自定义异常类必须继承Exception类,是为了使用raise的能力.否则会报错误.
try: # print(a) error_instance = NameError("name 'a' is not define") # 创建指定异常的实例对象 print(id(error_instance)) # 2291212287760 raise error_instance # 抛出指定的异常实例对象 # except NameError as error: # 里面写了各种错误类型,根据错误去找是什么样的错误类型. # print('提示:%s' % error) # 实际是一个NameError()类产生的一个实例对象.error实际就是一个错误类型的实例对象. # print(id(error)) # 2291212287760 # error = error_instance ,实际对应关系. class PhoneException(Exception): # 实际的 # def __init__(self, name): # self.name = name # # def __str__(self): # # return 'xxxxxxxxxxxxxxxx' # return self.name pass phone_num = input('手机号:') try: if len(phone_num) != 11: # print('号码位数不对') raise PhoneException('手机号码位数不对') elif phone_num.isdecimal() is False: # isdecimal():判断是不是数字,返回值是False或者是True # print('号码不是纯数字') raise PhoneException('手机号码不是纯数字') except PhoneException as error: print(error) var = 'df'.center(20,'*') # 输出 : *********df********* print(var)