错误类型

语法错误(Syntax errors):代码编译时的错误,不符合Python语言规则的代码会停止编译并返回错误信息

异常(Exceptions):只在代码运行时才会发生,如类型错误、数值错误、索引错误和属性错误等。

  • 语法错误包含在异常基类中

Python与Java异常类层级区别

语法错误

常见的语法错误(SyntaxError)包括:

  • 缺少起始符号或结尾符号(括号、引号等)
  • 缩进错误关键词拼写错误
    示例:

异常

异常通常由以下问题引起:

  • 在定义函数之前就引用该函数
  • 调用不属于某个对象的方法或者属性
  • 试图将某个值转换为不恰当的数据类型

六种异常类型

  1. 除零错误(ZeroDivisionError):除数为0
  2. 名称错误(NameError):变量使用前未进行申明或者初始化
  3. 类型错误(TypeError):某些函数或者方法只适用于特定的数据类型,如果对数据类型的操作不当,就会产生类型错误
  4. 数值错误(ValueError):在输入类型正确的情况下,具体输入值错误
  5. 索引错误(IndexError):超出序列长度的索引操作
  6. 属性错误(AttributeError):方法或者属性不适用该对象

捕获语法

  • 程序要遇到异常的时候,往往是直接中断,跳出执行。但是有些时候,我们需要在遇到异常的时候另外处理,而不是直接停止。
  • 解决方法:
    try...except...语句
    try...except...else语句
    finally子句
try...except...语句
try:
    #可能抛异常的代码块
except:
    #抛出异常处理的代码
  • try 关键词内执行的是正常代码,当这部分代码出错的时候,会跳过错误代码后进入 except 关键词内部,执行此部分的代码
try...except...else语句
  • 当在 try...except... 后加入的 else 指,当程序没发生错误时执行的部分
try:
    #可能抛异常的代码块
except(Exception1,Exception2,.....),e:
    #发生Exception1、Exception2.....处理方式
else:
    #正确时执行


finally子句

  • finally 语句是指,无论程序运行对或错,都会执行的部分
try:
    #可能抛异常的代码块
except(Exception1,Exception2,.....),e:
    #发生Exception1、Exception2.....处理方式
else:
    #正确时执行
finally:
    #无论对错都执行

Assert、with语句

assert关键字

  • 当Expression部分为True时,则正确执行,程序继续下去;当判断为False时,则抛出后面的e错误提示。
  • 在大型的项目中,assert常被用来作为“防御性编程”
assert  Expression,e

两种特殊简便方法

with语句

  • 有时候打开了文件却忘记关闭,或者是在读取文件过程出错,那么"with"语句能够很好解决关于文件读取、写入的问题
with open() as f:
      cnotallow=f.readlines()

上面的语句等价于

f=open()
cnotallow=f.readlines() #代码块
f.close()


自主控制异常:抛出异常

  • 除了在代码运行出错时触发错误,我们还可以主动控制抛出异常,通过使用关键词 raise(类似Java语言中的throw)

自主控制异常:用户自定义异常

自定义异常的原因

  • Python提供的内建异常不够用
  • 可以预估某个错误的产生

定义异常类

  • 继承于Exception类,由它开始扩展

自主定义的NotIntError异常类,捕获非整型错误


利用抛出异常并处理优点

  • 增强代码的鲁棒性而不必影响程序的主逻辑,专注程序主逻辑,保持代码的简洁清晰
  • 异常判断是就地实时的,与代码运行是实时的
  • 一些低调用级别的代码块没有判断和处理其上级调用模块的权限或者根本无法判断,只能由其上级调用模块来决定下一步怎么做,这时当前模块可以不用处理,将错误抛出给调用者

异常处理与流程控制

异常处理应该与正常流程控制分离

  1. 异常处理搞乱了代码逻辑
  2. 将异常代码块抽离到另外的函数中