异常处理
1. 功能:防止出错而导致整个程序运行不了,实际程序在后台捕获到
分析:try的代码优先执行,如果出借,python内部会作出处理,创建一个Exception类的一个对象e,e这个对象中封装了错误信息
try:
#代码块,逻辑
pass
except Exception as e:
# 上述代码块出错后,自动执行当前块,通俗理解,如果上面操作不行,执行以下操作
i = 1
示例:用户输入数字可以正常转换,否则就默认打印1
[root@node2 class2]# cat try.py
#!/usr/local/python3/bin/python3
while True:
try:
inp = input('enter a number: ')
i = int(inp)
except Exception as e:
i = 1
print(e)
print(i)
[root@node2 class2]# python3 try.py
enter a number: 2
enter a number: 4
enter a number: dk
invalid literal for int() with base 10: 'dk' #e的错误信息
2.错误类型:每种错误都有一个对象来表示
In [1]: li=[11,22]
In [2]: li[99]
IndexError: list index out of range
In [3]: int('dkd')
ValueError: invalid literal for int() with base 10: 'dkd'
场景:把Exception转换成具体的错误类型才捕获,如果不是具体指定的错误类型,就直接是全部错误
分析:IndexError和ValueError只能捕获相对应的错误,而Exception是全部都可以捕获,而且它们都是Exception的子类
In [5]: try:
...: li = [11,22]
...: li[99]
...: except IndexError as e: #如果是IndexError就可以捕获到
...: print(e)
...:
list index out of range
In [6]: try:
...: int('dkd') #替换后,不能正常捕获
...: except IndexError as e:
...: print(e)
ValueError: invalid literal for int() with base 10: 'dkd'
3. 日志使用
描述:程序出错写入日志时,把错误类型分类的写入到不同的文件中,把重要的错误分到主文件,其他的小错误分配到一个文件
实现:先写出具体的错误捕获类型,最后写一个Exception,也就是如果之前的可以捕获就直接输出,不能捕获交给Exception
4.主动触发异常
分析:Exception类加括号,表示创建对象,再把这个对象赋值给e,e就是错误的对象
In [7]: try:
...: raise Exception('failed') #主动触发异常
...: except Exception as e:
...: print(e)
...:
failed
使用场景:函数可以嵌套函数
分析:出现错误就需要记录日志,not result表示没有执行成功,就要在下面open file写入日志,如果操作日志的实现比较复杂,那么就会增加代码量,这是db操作的错误,实际在Index里还可以有其他的代码如下面的int操作,也可能会出现错误,也要在except后面打开日志文件写入异常,not result的结果有错误也要写入日志中,操作两次
优化:两个都使用except后面的写入日志的功能,在not result后直接raise,这样raise Exception('db handle error')中的db handle error就是错误信息,这样str_error就直接是这个db错误,同时调用写入日志的操作
def db():
#db是操作数据库,可能成功或者失败
return True #操作成功,false则失败,如果出错需要记录到异常中,而且把错误信息写入到日志中
def index():
try:
r = input(">>") #也会有错误
int(r)
try:
result = db() #如果result是True表示成功,如果是false是失败,失败需要记录到日志
if not result:
#打开文件,写入日志,有了raise,这个打开写入日志的操作就可以省略
raise Exception('db handle error')
except Exception as e: #e是错误信息
str_error = str(e) #取得字符串的错误信息
print(str_error)
# 记录日志,需要打开一个文件才写,如果不raise Exception就要重复做这个操作
index() #执行
5.自定义异常
描述:Exception捕获所有异常,IndexError继承它的异常,可以自定义编写一个类,让它继承Exception
[root@node2 class2]# cat error-handle.py
#!/usr/local/python3/bin/python3
class newError(Exception):
def __init__(self,msg):
self.message = msg
def __str__(self):
return self.message
obj = newError('xxx')
print(obj) #默认调用str方法,把xxx值赋予message,返回message
[root@node2 class2]# python3 error-handle.py
xxx
设置异常
[root@node2 class2]# cat error-handle.py
#!/usr/local/python3/bin/python3
class newError(Exception):
def __init__(self,msg):
self.message = msg
def __str__(self):
return self.message
try:
raise newError('i am wrong') #相当于执行了obj = newError('xxx'),创建对象,把对象赋值给e(相当于obj)
except newError as e: #当于newError相关的异常就捕获
print(e) #执行e对象的__str__的方法,获取返回值
[root@node2 class2]# python3 error-handle.py
i am wrong
6.断言:assert 条件
描述:如果条件成立,代码什么都不执行,继续向下执行,如果不成立,整个程序就要出错,最终目的是要使用程序就强制要满足某个条件,否则,并且可以捕获,但是一般不捕获
例子:假设软件只支持ios,不支持安卓,安装上了安卓,但是一操作马上报错
[root@node2 class2]# cat ass.py
#!/usr/local/python3/bin/python3
print(23)
assert 1==1 #条件成立就通过,不成立就报错
print(565)
[root@node2 class2]# python3 ass.py
23
565
[root@node2 class2]# cat ass.py
#!/usr/local/python3/bin/python3
print(23)
assert 1==2
print(565)
[root@node2 class2]# python3 ass.py
23
Traceback (most recent call last):
File "ass.py", line 3, in <module>
assert 1==2
AssertionError