6.10 异常处理
- 程序中的错误分为两种:语法错误和逻辑错误
- 语法错误:
-
if #------------------ print(haha
- 逻辑错误:
-
#用户输入不完整(比如输入为空)或者输入非法(输入不是数字) num=input(">>: ") int(num)
- 什么是异常:代码发生异常错误之后,你的程序就中断了
- 什么是异常处理:当代码出现异常时,我通过某种方式不让你程序中断,合理的跳出去,叫做异常处理
- 为什么要有异常处理?用户体验良好,使你的代码更有健壮性容错性
- 异常处理的两种方式:
- if判断式
总结:
1.if判断式的异常处理只能针对某一段代码,对于不同的代码段的相同类型的错误你需要写重复的if来进行处理。
2.在你的程序中频繁的写与程序本身无关,与异常处理有关的if,会使得你的代码可读性极其的差
3.if是可以解决异常的,只是存在1,2的问题,所以,千万不要妄下定论if不能用来异常处理。
- python专有异常处理
python:为每一种异常定制了一个类型,然后提供了一种特定的语法结构用来进行异常处理
- if判断式
- 错误举例:
-
# 触发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的方式的好处
- 改善代码容错性
- 增强程序鲁棒性
原文地址:https://www.cnblogs.com/zhangdadayou/p/11415380.html
时间: 2024-10-24 09:12:41