Python之面向对象异常处理
Posted zhangdadayou
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python之面向对象异常处理相关的知识,希望对你有一定的参考价值。
6.10 异常处理
程序中的错误分为两种:语法错误和逻辑错误
语法错误:
if #------------------ print(haha
逻辑错误:
#用户输入不完整(比如输入为空)或者输入非法(输入不是数字) num=input(">>: ") int(num)
什么是异常:代码发生异常错误之后,你的程序就中断了
什么是异常处理:当代码出现异常时,我通过某种方式不让你程序中断,合理的跳出去,叫做异常处理
为什么要有异常处理?用户体验良好,使你的代码更有健壮性容错性
异常处理的两种方式:
if判断式
总结:
1.if判断式的异常处理只能针对某一段代码,对于不同的代码段的相同类型的错误你需要写重复的if来进行处理。
2.在你的程序中频繁的写与程序本身无关,与异常处理有关的if,会使得你的代码可读性极其的差
3.if是可以解决异常的,只是存在1,2的问题,所以,千万不要妄下定论if不能用来异常处理。
python专有异常处理
python:为每一种异常定制了一个类型,然后提供了一种特定的语法结构用来进行异常处理
错误举例:
# 触发IndexError l=['egon','aa'] l[3] # 触发KeyError dic='name':'egon' dic['age'] #触发ValueError s='hello' int(s)
常用异常:
AttributeError #试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x IOError #输入/输出异常;基本上是无法打开文件 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: pass except Exception as e: print(e) print(666)
什么时候用万能?什么时候用多分支?:如果你对错误信息不关心,只是想要派出错误让程序继续运行,就用万能异常 你对错误信息要进行明确的分流,让你的程序多元化开发
多分支+万能异常
def func(): pass def func1(): pass dic = 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=n1 print(11) print(22)
自定义异常
python中提供的错误类型很多种,但是不是全部的错误
class LiYeError(BaseException): def __init__(self,msg): self.msg=msg def __str__(self): return self.msg try: # 三行 raise LiYeError('socket.connent.....') except LiYeError as e: # e = LiYeError('类型错误') print(e)
try...except的方式比较if的方式的好处
- 改善代码容错性
- 增强程序鲁棒性
以上是关于Python之面向对象异常处理的主要内容,如果未能解决你的问题,请参考以下文章
Python_day8_面向对象(多态成员修饰符类中特殊方法对象边缘知识)异常处理之篇