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之面向对象(七)异常处理

评论关闭