python3捕获异常_Python 3 基础之异常及其捕获

异常

异常是什么?

当Python检测到一个错误时,解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的"异常"、

也就是说不符合Python语法、与python语法有异的代码运行时会报错,这就是异常

1、异常类型对照汇总:

BaseException 所有异常的基类+--SystemExit 解释器请求退出+-- KeyboardInterrupt 用户中断执行(通常是输入^C)+--GeneratorExit 生成器(generator)发生异常来通知退出+--Exception 常规错误的基类+--StopIteration 迭代器没有更多值+--StopAsyncIteration 必须通过异步迭代器对象的__anext__()方法引发以停止迭代+--ArithmeticError 所有数值计算错误的基类| +--FloatingPointError 浮点计算错误| +--OverflowError 数值运算超出最大限制| +--ZeroDivisionError 除(或取模)零 (所有数据类型+--AssertionError 断言语句失败+--AttributeError 对象没有这个属性+--BufferError 与缓冲区相关的操作时引发+--EOFError 没有内建输入,到达EOF 标记+--ImportError 导入失败| +--ModuleNotFoundError 找不到模块+--LookupError 无效数据查询的基类| +--IndexError 序列中没有此索引(index)| +--KeyError 映射中没有这个键+--MemoryError 内存溢出错误+--NameError 未声明、初始化对象| +--UnboundLocalError 访问未初始化的本地变量+--OSError 操作系统错误,| +--BlockingIOError 操作将阻塞对象设置为非阻塞操作| +--ChildProcessError 子进程上的操作失败| +--ConnectionError 与连接相关的异常的基类| | +--BrokenPipeError 在已关闭写入的套接字上写入| | +--ConnectionAbortedError 连接尝试被对等方中止| | +--ConnectionRefusedError 连接尝试被对等方拒绝| | +--ConnectionResetError 连接由对等方重置| +--FileExistsError 创建已存在的文件或目录| +--FileNotFoundError 请求不存在的文件或目录| +--InterruptedError 系统调用被输入信号中断| +--IsADirectoryError 在目录上请求文件操作| +--NotADirectoryError 在不是目录的事物上请求目录操作| +--PermissionError 在没有访问权限的情况下运行操作| +--ProcessLookupError 进程不存在| +--TimeoutError 系统函数在系统级别超时+--ReferenceError 弱引用试图访问已经垃圾回收了的对象+--RuntimeError 一般的运行时错误| +--NotImplementedError 尚未实现的方法| +--RecursionError 解释器检测到超出最大递归深度+--SyntaxError Python 语法错误| +--IndentationError 缩进错误| +--TabError Tab 和空格混用+--SystemError 一般的解释器系统错误+--TypeError 对类型无效的操作+--ValueError 传入无效的参数| +--UnicodeError Unicode 相关的错误| +--UnicodeDecodeError Unicode 解码时的错误| +--UnicodeEncodeError Unicode 编码时错误| +--UnicodeTranslateError Unicode 转换时错误+--Warning 警告的基类+--DeprecationWarning 关于被弃用的特征的警告+--PendingDeprecationWarning 关于构造将来语义会有改变的警告+--RuntimeWarning 可疑的运行行为的警告+--SyntaxWarning 可疑的语法的警告+--UserWarning 用户代码生成的警告+--FutureWarning 有关已弃用功能的警告的基类+--ImportWarning 模块导入时可能出错的警告的基类+--UnicodeWarning 与Unicode相关的警告的基类+--BytesWarning bytes和bytearray相关的警告的基类+-- ResourceWarning 与资源使用相关的警告的基类。。

2、捕获异常

捕获异常的书写格式:

# 捕获异常的书写格式

try:

执行可能发生异常的代码except异常类型(可以是多个):

如果发生异常执行的代码

2.1、捕获单个异常

单个异常捕获需要 except: 后面跟的异常类型与实际运行报异常的类型一致

try:print(a)exceptNameError as N:print('捕获异常类型:%s' % N)

try中的print(a) 代码执行异常,发生异常后运行except:里面的代码

2.2、捕获多个异常

多个捕获异常,需要把多个异常的类型找出来对应异常放在except后面,可以把要捕获的异常的名字,放到except 后,并使用元组的方式仅进行存储

try:print(a)

open('123.txt','r')except(NameError,FileNotFoundError) as N:print('捕获异常类型:%s' % N)

2.3、获取异常信息的描述

格式

try:

执行可能发生异常的代码

excpet (异常类型1, 异常类型2, ....) as 临时变量名:

可以获得临时变量名

实例

try:print(a)

open('123.txt','r')except(NameError,FileNotFoundError) as N:#当有多个异常信息时,只按顺序显示 一个

print('捕获异常类型:%s' % N)

2.4、捕获所有异常

格式:

try:

执行可能发生异常的代码exceptException as 临时变量:

发生异常执行的代码

实例,同时获取所有捕获异常的信息描述:

try:

open("hm1.txt", "r")#Exception把python中所有异常兼容,是所有异常的父类

exceptException as E:#except Exception:可以简写成 except: 意思是各种异常类型

print("捕获到了异常:%s" % E)

2.5、捕获异常中的else

若没有捕获异常,执行else中的代码

try:

open("hm.txt", "r")except:#try中的代码发生了异常执行except代码

print("except")else:#如果try中的代码没有发生异常 就会执行else中的代码

print("else")

2.6、捕获异常的finally

在程序中,如果一个段代码必须要执行,即无论异常是否产生都要执行,那么此时就需要使用finally。 比如文件关闭,释放锁,把数据库连接返还给连接池等

try:

open("hm.txt", "r")except:#try中的代码发生了异常执行except代码

print("except")else:#如果try中的代码没有发生异常 就会执行else中的代码

print("else")finally:#无论try中的异常 代码是否发生异常,finally都会执行

print('finally')

demo:

importtimetry:

f= open('test.txt')try:whileTrue:

content=f.readline()if len(content) ==0:breaktime.sleep(2)print(content)except:#如果在读取文件的过程中,产生了异常,那么就会捕获到

#比如 按下了 ctrl+c

pass

finally:

f.close()print('关闭文件')except:print("没有这个文件")

3、异常的传递

3.1、try嵌套

importtimetry:

f= open('test.txt')try:whileTrue:

content=f.readline()if len(content) ==0:breaktime.sleep(2)print(content)except:#如果在读取文件的过程中,产生了异常,那么就会捕获到

#比如 按下了 ctrl+c

pass

finally:

f.close()print('关闭文件')except:print("没有这个文件")

3.2、异常的传递

deftest1():print("----test1-1----")print(num)print("----test1-2----")deftest2():print("----test2-1----")

test1()print("----test2-2----")deftest3():try:print("----test3-1----")

test1()print("----test3-2----")exceptException as result:print("捕获到了异常,信息是:%s"%result)print("----test3-2----")

test3()print("------华丽的分割线-----")

test2()

如果try嵌套,那么如果里面的try没有捕获到这个异常,那么外面的try会接收到这个异常,然后进行处理,如果外边的try依然没有捕获到,那么再进行传递。。。

如果一个异常是在一个函数中产生的,例如函数A---->函数B---->函数C,而异常是在函数C中产生的,那么如果函数C中没有对这个异常进行处理,那么这个异常会传递到函数B中,如果函数B有异常处理那么就会按照函数B的处理方式进行执行;如果函数B也没有异常处理,那么这个异常会继续传递,以此类推。。。如果所有的函数都没有处理,那么此时就会进行异常的默认处理,即通常见到的那样

当调用test3函数时,在test1函数内部产生了异常,此异常被传递到test3函数中完成了异常处理,而当异常处理完后,并没有返回到函数test1中进行执行,而是在函数test3中继续执行

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值