Python 学习笔记(12)错误&异常

Python 学习笔记(12)错误&异常

12.1 错误&异常定义

在编程过程中经常会碰到各种各样的错误,可以大致将这些错误分为两类,即【语法错误】和【运行时错误】。

12.1.1 语法错误

语法错误是指当代码被解释时发现不符合python语法规则而报出 SyntaxError

语法错误属于真正意义上的错误,大多数是由编程者的疏忽或对于编程规则的不熟悉导致的,程序需要在修改所有的语法错误后才能正常运行。

12.1.2 运行时错误

代码在语法规则上正确但依旧又可能会在运行时发生错误,例如被除数设为0等,这种就是运行时错误,我们将之称为【异常】。

异常类型含义
AssertionErrorassert 关键字后的条件为假
AttributeError调用或访问的对象属性不存在
IndexError索引超出序列范围
KeyError字典中查找不存在的关键字
NameError调用或访问一个未定义变量
TypeError不同类型数据之间违规操作
ZeroDivisionError除数为0

当程序发生异常时,可以通过捕获异常的名称后通过其他代码让程序继续运行,这种逻辑处理机制被称为【异常处理】。

通过异常处理可以使开发者全面管理自己的程序,在可能出错的地方添加相应的处理从而提高程序的健壮性。

实际上,异常处理机制通常用来预防各种可能出现的问题或错误,同时也可以给用户的任何非法输入提供对应的输出,毕竟开发者无法考虑到所有的情况并进行相应的补救,这是一个十分耗费时间和精力的事情。

12.2 异常处理

try:
    ...
except [error [as xxx]]:
    ...
except [(error_1, error_2) [as xxx]]:
    ...
except:
    ...
[else:
    ...
finally:
    ...]

"""
except 块可以一次定义需要处理的多种异常,使用元组形式存储;可以使用 except error_1: pass 捕获后忽略错误;

当 except 不接任何异常时代表可捕获所有类型的异常,一般放在最后一个位置;

else 块中包含的语句会在没有任何异常的情况下执行,即使在前面的 except 中处理了异常也不会执行;

finally 块中的内容无论是否发生了异常最后都会执行,可以直接写成 try...finally...,通常可用于释放资源例如关闭文件等。当 try/except 中包含了 return 语句时,会先跳转到 finally 执行后返回执行 return。
"""

捕获异常try 中包含的是需要监测的代码块,如果出现异常系统则会自动生成一个异常类型,并将该异常提交给解释器;代码块中【异常发生点】后的剩余代码永远不会运行;

处理异常:当解释器收到异常后,会依次比较符合该异常的 except 块,找到归属后执行块中包含的语句。

12.3 手动设置异常

raise

raise [exceptionName]

raise [exceptionName [(reason)]]

"""
单独 raise 语句将会引发当前上下文中捕获的异常或默认引发 RuntimeError;

raise 后接异常类型将会引发该类型的异常;

raise 后还可接异常的具体原因;
"""

手动设置异常通常是为了使用 try...except... 将其捕获并进行处理,这种设置可以保证程序的运行是正常的不会导致程序错误。

手动设置异常通常可以用于防止用户违规输入信息,通过 if 语句进行输入判定是否需要抛出异常进行相应处理。

12.4 获取异常信息

捕获异常时,有两种方式可以获得更多的异常信息:

1)使用 sys.exc_info()sys.last_traceback()

2)使用 traceback 模块中的相关函数。

sys.exc_info() 方法会将当前异常信息以 (type, value, traceback) 的形式返回,分别为异常类型、异常实例以及 traceback 对象。 traceback 对象需要使用 traceback.print_tb() 进行读取,会输出产生异常的文件名、抛出异常的代码所在行以及具体代码。

在实际开发过程中,许多复杂功能的实现会由很多小函数组合而成,因此经常会发生一系列的函数或方法调用。当发生异常时,错误信息会从当前方法或函数向外传播至该函数的调用者,经过层层递进传递到解释器中,所以我们看到很多错误提示有很多行很多函数构成,这些也被称为【异常传播轨迹信息】。

实际上,异常信息传播轨迹信息记录了应用程序中执行停止的各个代码段,其最后一行详细显示了异常的类型及详细信息。

当程序处于 except 块中时,其捕获的异常信息可以通过 sys 对象进行获取,形式与 sys.exc_info() 方法返回的信息相似。

# import traceback

try:
    ...
except:
    # 捕获异常并输出至控制台
    traceback.print_exc([limit [, file]])
    # 捕获异常并转换为字符串
    traceback.format_exc()
    
"""
limit 用于限制传播层数,默认全部显示

file 将异常传播轨迹信息输出至文件
"""
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值