一 异常和错误
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