异常处理

一 什么是异常

异常指的是与正常情况不同。异常就是程序运行时发生错误的信号,在程序执行过程中,出现了错误,导致代码无法继续执行下去,就称之为异常。实例如图:

异常的三个组成部分:异常的追踪信息、异常的类型、异常的值。

错误的类型又分为两种,在抛出异常时又有不同。

print("语法错误")
a=





>>>:
 File "D:/学习/old_boy_study/1.py", line 2
    a=
     ^
SyntaxError: invalid syntax
语法错误:当发生语法错误时,不会执行程序代码,因为这种错误无法过python解释器的语法检测。
print("逻辑错误")
a=[1,2,3]
print(a[3])
print("逻辑错误")


>>>:
逻辑错误
Traceback (most recent call last):
  File "D:/学习/old_boy_study/1.py", line 3, in <module>
    print(a[3])
IndexError: list index out of range
逻辑错误:在错误发生前的代码都会正常执行,知道运行到发生错误的代码,抛出异常,程序结束。

二 异常的类型

AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
IOError 输入/输出异常;基本上是无法打开文件
ImportError 无法引入模块或包;基本上是路径问题或名称错误
IndentationError 语法错误(的子类) ;代码没有正确对齐
IndexError  索引不存在
KeyError 试图访问字典里不存在的键
KeyboardInterrupt Ctrl+C被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError 语法错误
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它
ValueError 传入一个调用者不期望的值,即使值的类型是正确的

常用异常
异常的常用类型

三 异常的处理

正确处理异常的三种方式:

1.如果能明确知道异常发生的原因,便不要产生异常,使用if判断等方式进行避免错误
2.不知道发生异常的原因,但是知道异常的类型,那就明确捕获该类型的异常
3.即不知道发生异常的原因,也不知道异常的类型,可以使用万能异常类型(Exception),但是必须注意一点,必须打印异常的消息。

异常处理的8种语法:(当try中的代码参数了异常后,try中之后的代码便不会再运行,会直接跳到except中运行相应的语句)

try:
    a=[1,2,3]
    print(a[3])

except IndexError:  #捕捉一种异常类型
    print("发生了index Error")
语法1:一个异常类型的try...except...
语法2:try..多个except..捕捉多个类型异常
try:
    a=[1,2,3]
    print(a[3])
    b=int('abc')

except (ValueError,IndexError):
    print("发生了 ValueError  或者 IndexError")
语法3:try..except(多个异常类型)
try:
     # 把可能发出错误的代码放到try中
    print("start")
    # a = int("abc")
    # li[1]
    10 / 0
    dic = {}
    dic["name"]
    print("over")

except Exception:
    print("可能是任何类型的错误 反正是发生错误了")
语法4:万能异常
try:
     # 把可能发出错误的代码放到try中
    print("start")
    # a = int("abc")
    # li[1]
    10 / 0
    dic = {}
    dic["name"]
    print("over")

# 可以通过给异常取别名 来获取异常的对象  对象中包含了错误信息
except Exception as e:
    print("可能是任何类型的错误 反正是发生错误了")
    print(e)
    print(type(e))
语法5:万能异常,输出异常值
# 语法6 先捕获能够明确的异常类型 最后捕获万能异常类型
try:
     # 把可能发出错误的代码放到try中
    print("start")
    a = int("abc")
    li[1]
    10 / 0
    dic = {}
    dic["name"]
    print("over")
except ValueError:
    print("值不对.....")
except ZeroDivisionError:
    print("除数不能为0")
# 可以通过给异常取别名 来获取异常的对象  对象中包含了错误信息
except Exception as e:
    print("可能是任何类型的错误 反正是发生错误了")

print("over")
语法6:先捕获能够明确的异常类型 最后捕获万能异常类型
try:
    a=[1,2,3]
    print(a[2])
    b=int('5')

except (ValueError,IndexError):
    print("发生了 ValueError  或者 IndexError")
else:
    print("没有发生异常")
语法7:try...except..else,当try中的语句没有异常时,会执行else中的代码
try:
    a=[1,2,3]
    print(a[3])
    b=int('5')

except (ValueError,IndexError):
    print("发生了 ValueError  或者 IndexError")
finally:
    print("执行了finall")
语法8:try...expect...finally,无论try中的代码有无发生异常,都会执行finall中的代码

finally可用于资源的回收

四 自定义异常类

raise关键字 

  作用:主动抛出异常,后面跟任意Exception类型的子类。

为何要自定义异常类:

  在我们用代码敲了一个功能,提供给别人使用时,别人不按照我们所定制的要求去使用,可能会导致程序出错,而且我们无法帮助用户处理这个错误,这个时候我们使用自定义异常类,主动抛出异常,不让用户这么操作,它的操作必须严格按照我们的要求。

class LoginException(Exception):
    pass

def login():
    name=input("name>>>:").strip()
    pwd=input("password>>>:").strip()
    if name=='egon' and pwd == '123' :
        print("登陆成功")
    else:
        raise LoginException("用户名密码错误!")

login()
自定义异常的登录功能

五 断言

  断言即断定的意思,指有一段代码需要执行必须要保证某个条件成立,否则无法执行。

练习:

  需求:列表中有一堆数据需要被处理,但是只有当列表中有数据时才执行处理代码,否则抛出异常。

names=[]
if not names:
    raise TypeError("列表中没有数据")
print("下面开始处理数据")
print("处理数据的中。。。")
print("数据处理完毕")
不使用断言完成需求
names=[]
assert names  #当names中不为空时,执行代码,不然抛出异常
print("下面开始处理数据")
print("处理数据的中。。。")
print("数据处理完毕")
断言版
原文地址:https://www.cnblogs.com/846617819qq/p/10149815.html