1.2.8 python的异常处理

错误类型

语法错误(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 关键词内部,执行此部分的代码

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:      content=f.readlines()

上面的语句等价于

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

 

自主控制异常:抛出异常

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

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

自定义异常的原因

  • Python提供的内建异常不够用

  • 可以预估某个错误的产生

定义异常类

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

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

 

利用抛出异常并处理优点

  • 增强代码的鲁棒性而不必影响程序的主逻辑,专注程序主逻辑,保持代码的简洁清晰

  • 异常判断是就地实时的,与代码运行是实时的

  • 一些低调用级别的代码块没有判断和处理其上级调用模块的权限或者根本无法判断,只能由其上级调用模块来决定下一步怎么做,这时当前模块可以不用处理,将错误抛出给调用者

异常处理与流程控制

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

  1. 异常处理搞乱了代码逻辑

  2. 将异常代码块抽离到另外的函数中

     

了解更多信息关注公众号

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zemuerqi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值