一、什么是异常
异常就是程序运行时发生错误的信号,在程序出现错误时,则会产生一个异常,若程序没有处理它,则会抛出该异常,程序的运行也随之终止,在
python
中,错误有如下两种:
1、语法错误
即代码语句不符合python
语法规范,比如if
语句缺少冒号,print
语句缺少括号等。这种语法错误会被python
解释器语法检测出来,导致程序无法正常运行,所以必须在程序执行前就改正该类错误。
2、逻辑错误
#TypeError:int类型不可迭代
for i in 3:
pass
#ValueError
num=input(">>: ") #输入hello
int(num)
#NameError
aaa
#IndexError
l=['egon','aa']
l[3]
#KeyError
dic={'name':'egon'}
dic['age']
#AttributeError
class Foo:pass
Foo.x
#ZeroDivisionError:无法完成计算
res1=1/0
res2=1+'str'
二、异常种类
在
python
中不同的异常可以用不同的类型(python
中统一了类与类型,类型即类)去标识,一个异常标识一种错误。
常见的异常种类:
1、如果错误发生的条件是可预知的,我们需要用if进行处理:在错误发生之前进行预防。
AGE=10
while True:
age=input('>>: ').strip()
if age.isdigit():
#只有在age为字符串形式的整数时,下列代码才不会出错,该条件是可预知的
age=int(age)
if age == AGE:
print('you got it')
break
2、如果错误发生的条件是不可预知的,则需要用到try...except
:在错误发生之后进行处理。try
中发现错误会传递给except
,所以发生try
中发生异常后的语句不会执行。
#基本语法为
try:
被检测的代码块
except 异常类型:
try中一旦检测到异常,就执行这个位置的逻辑
#例子
try:
f=open('a.txt')
g=(line.strip() for line in f)
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
except StopIteration:
f.close()
3、万能异常
如果在except
后面直接写明具体异常种类,程序遇到其他的异常,则except
就不能发挥捕获异常的功能。所以可以用"Exception
",万能异常来捕获。
#例子:
try:
age = int(input('>>>'))
l = []
l[10]
except Exception as e:
print(e)
4、多分支异常与万能异常
4.1 如果无论出现什么异常,我们统一丢弃,或者使用同一段代码逻辑去处理他们,只有一个Exception
就足够了。
4.2 如果你想要的效果是,对于不同的异常我们需要定制不同的处理逻辑,那就需要用到多分支了。
5、也可以在多分支后来一个Exception
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)
6、异常处理中的else
和finally
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)
else:
print('try内代码块没有异常则执行我')
finally:
print('无论异常与否,都会执行该模块,通常是进行清理工作')
7、通过raise
主动触发异常
try:
raise TypeError('类型错误')
except Exception as e:
print(e)
8、自定义异常
需要继承BaseException类
class EgonException(BaseException):
def __init__(self,msg):
self.msg=msg
def __str__(self):
return self.msg
try:
raise EgonException('类型错误')
except EgonException as e:
print(e)
9、断言:assert 条件
assert 1 == 1
assert 1 == 2
四、总结try..except
1 把错误处理和真正的工作分开来;
2 代码更易组织,更清晰,复杂的工作任务更容易实现;
3 毫无疑问,更安全了,不至于由于一些小的疏忽而使程序意外崩溃了。