一 异常和错误
1. 程序中难免出现错误, 而错误分成两种
1. 语法错误(这种错误, 根本过不了 Python 解释器的语法检测, 必须在程序执行前就改正)
- # 语法错误示范一
- if
- # 语法错误示范二
- def test:
- pass
- # 语法错误示范三
- print(haha
2. 逻辑错误
- # 用户输入不完整 (比如输入为空) 或者输入非法(输入不是数字)
- num=input(">>:")
- int(num)
- # 无法完成计算
- res1 = 1/0
- res2 = 1+'str'
2. 异常
异常就是程序运行时发生错误的信号, 在 Python 中, 错误触发的异常如下
3.Python 中的异常种类
在 python 中不同的异常可以用不同的类型 (Python 中统一了类与类型, 类型即类) 去标识, 不同的类对象标识不同的异常, 一个异常标识一种错误
二 异常处理
什么是异常?
异常就是我们语法上是没有问题, 但是运行时就报错的称为异常, 异常发生之后剩余代码将不会继续执行
什么是异常处理
Python 解释器检测到错误, 触发异常(也允许程序员自己触发异常 raise)
程序员编写特定的代码, 专门用来捕捉这个异常(这段代码与程序逻辑无关, 与异常处理有关)
如果捕捉成功则进入另外一个处理分支, 执行你为其定制的逻辑, 使程序不会崩溃, 这就是异常处理
为什么要进行异常处理?
Python 解析器去执行程序, 检测到了一个错误时, 触发异常, 异常触发后且没被处理的情况下, 程序就在当前异常处终止, 后面的代码不会运行, 谁会去用一个运行着突然就崩溃的软件.
所以你必须提供一种异常处理机制来增强你程序的健壮性与容错性
处理异常的两种方式:
流程控制语句(if)
异常处理 -- "私人订制"
三 Python 异常处理的'私人定制'
Python: 为每一种异常定制了一个类型, 然后提供了一种特定的语法结构用来进行异常处理
1 基本语法
try:
被检测的代码块
except 异常类型:
try 中一旦检测到异常, 就执行这个位置的逻辑
```python
读文件示例
- f = open("userinfo","r",encoding="utf-8")
- while True:
- try:
- print(next(f))
- except StopIteration:
- f.close()
- break
next(f)会触发迭代 f, 依次 next(f)就可以读取文件的一行行的内容, 无论文件 userinf 有多大, 同一时刻内存中只有一行内容. 当文件句柄 f 中的内容 next 完后就会抛出异常 StopIteration 后才可以执行 f.close()
2 异常类处理指定的异常情况
未捕获到异常, 程序直接报错
- s1 = 'hello'
- try:
- int(s1)
- except IndexError as e: # as 相当于将报错信息赋值给了 e
- print e
正确方法:
- s1 = 'hello'
- try:
- int(s1)
- except ValueError as e:
- print e
- # 报什么错, 用什么错误类型去接受
3 万能异常 - Exception
他可以捕获任意异常, 例如:
- s1 = 'hello'
- try:
- int(s1)
- except Exception as e:
- print(e)
- ```python
你可能会说既然有万能异常, 那么我直接用上面的这种形式就好了, 其他异常可以忽略
你说的没错, 但是应该分两种情况去看
如果你想要的效果是, 无论出现什么异常, 我们统一丢弃, 或者使用同一段代码逻辑去处理, 那么可以那么做
- s1 = 'hello'
- try:
- int(s1)
- except Exception,e:
- """丢弃或者执行其他逻辑"""
- print("编码逻辑")
- # 如果你统一用 Exception, 没错, 是可以捕捉所有异常, 但意味着你在处理所有异常时都使用同一个逻辑去处理(这里说的逻辑即当前 expect 下面跟的代码块)
4 多分支
- s1 = 'hello'
- try:
- int(s1)
- except IndexError as e:
- print(e)
- except KeyError as e:
- print(e)
- except ValueError as e:
- print(e)
- except Exception as e:
- print(e)
5 异常的其他结构
- s1 = 'hello'
- try:
- int(s1)
- except IndexError as e:
- print(e)
- except KeyError as e:
- print(e)
- except ValueError as e:
- print(e)
- else:
- print('try 内代码块没有异常则执行我')
- finally:
- print('无论异常与否, 都会执行该模块, 通常是进行清理工作')
6 主动触发异常
- try:
- raise TypeError('类型错误')
- except Exception as e:
- print(e)
7 自定义异常
- class EvaException(BaseException):
- def __init__(self,msg):
- self.msg = msg
- def __str__(self):
- return self.msg
- try:
- raise EvaException('类型错误')
- except EvaException as e:
- print(e)
8 断言
assert 条件
- assert 1 == 1
- assert 1 == 2
来源: http://www.bubuko.com/infodetail-3394903.html