Python之面向对象(七)异常处理,,6.10 异常处理程
Python之面向对象(七)异常处理,,6.10 异常处理程
6.10 异常处理
程序中的错误分为两种:语法错误和逻辑错误
语法错误:
if#------------------print(haha
逻辑错误:
#用户输入不完整(比如输入为空)或者输入非法(输入不是数字)num=input(">>: ")int(num)
什么是异常:代码发生异常错误之后,你的程序就中断了
什么是异常处理:当代码出现异常时,我通过某种方式不让你程序中断,合理的跳出去,叫做异常处理
为什么要有异常处理?用户体验良好,使你的代码更有健壮性容错性
异常处理的两种方式:
if判断式
总结:
1.if判断式的异常处理只能针对某一段代码,对于不同的代码段的相同类型的错误你需要写重复的if来进行处理。
2.在你的程序中频繁的写与程序本身无关,与异常处理有关的if,会使得你的代码可读性极其的差
3.if是可以解决异常的,只是存在1,2的问题,所以,千万不要妄下定论if不能用来异常处理。
python专有异常处理
python:为每一种异常定制了一个类型,然后提供了一种特定的语法结构用来进行异常处理
错误举例:
# 触发IndexErrorl=['egon','aa']l[3]# 触发KeyErrordic={'name':'egon'}dic['age']#触发ValueErrors='hello'int(s)
常用异常:
AttributeError #试图访问一个对象没有的树形,比如foo.x,但是foo没有属性xIOError #输入/输出异常;基本上是无法打开文件ImportError #无法引入模块或包;基本上是路径问题或名称错误IndentationError #语法错误(的子类) ;代码没有正确对齐IndexError #下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]KeyError #试图访问字典里不存在的键KeyboardInterrupt #Ctrl+C被按下NameError #使用一个还未被赋予对象的变量SyntaxError #Python代码非法,代码不能编译(个人认为这是语法错误,写错了)TypeError #传入对象类型与要求的不符合UnboundLocalError #试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它ValueError #传入一个调用者不期望的值,即使值的类型是正确的
单分支捕获异常:
#基本语法:try: 被检测的代码块except 异常类型: try 一旦检测异常,就执行这个位置的逻辑try: num=int(input("----"))#出现ValueError错误之后,直接跳转到except语句 dic={'name':"嘉欣"} print(dic['age'])except ValueError: print(66)
多分支捕获异常
try: num=int(input("----"))#出现ValueError错误之后,直接跳传到except语句 dic={'name':'加薪'} print(dic['age']) l1=[1,2] print(l1[100]) print(11)except ValueError: print('输入有非数字元素')except KeyError: print('没有此键')except IndexError: print('没有此下标')print(666)
万能异常捕获:处理所有python识别的异常
try: dic={'name':'嘉欣'} l1=[1,2] print(l1[100]) print(111) for i in 123: passexcept Exception as e: print(e)print(666)
什么时候用万能?什么时候用多分支?:如果你对错误信息不关心,只是想要派出错误让程序继续运行,就用万能异常 你对错误信息要进行明确的分流,让你的程序多元化开发
多分支+万能异常
def func(): passdef func1(): passdic = { 1: func, 2: func1,}try: num = int(input('请输入序号')) dic[num]()except ValueError: print('请输入数字')except KeyError: print('请输入范围内的序号')except Exception: print('程序出现意料之外的错误....')
try.....else......finally
try: dic = {'name': '嘉欣'} print(dic['age']) l1 = [1, 2] print(l1[100]) print(111)except KeyError: print('没有此键')except IndexError: print('没有此下标')else: print('如果没有出现异常则执行这里')finally: print('finally 666')#except必须依赖于try,else必须依赖于except和try#finally只是依赖于try#当没有异常执行else finally 有异常则执行异常 和finally#finally 用在关闭数据库连接,文件句柄关闭,数据保存等,用到finally
主动触发异常
class A: def func(self): raise Exception("使用父类方法")class B(A): def func(self): print("in B func")class C(A): def func(self): print("in C func")class D(A): def func1(self): print("in D func1")def function(obj): obj.func()obj1 = D()function(obj1)# 结果:Exception: 使用父类方法
断言:展现一种强硬的态度
name="alex"n1=input("请输入")assert name=n1print(11)print(22)
自定义异常
python中提供的错误类型很多种,但是不是全部的错误
class LiYeError(BaseException): def __init__(self,msg): self.msg=msg def __str__(self): return self.msgtry: # 三行 raise LiYeError('socket.connent.....')except LiYeError as e: # e = LiYeError('类型错误') print(e)
try...except的方式比较if的方式的好处
改善代码容错性增强程序鲁棒性Python之面向对象(七)异常处理
评论关闭