错误处理
在程序运行的时候可能会出现很多的问题,产生很多的错误。所以我们应该事先约定好出现错误应该返回的错误代码,这样我们在程序出现错误的时候就可以很快的找到错误的位置,然后进行修正。
return方式
用错误码来表示是否出错十分不便,因为函数本身应该返回的正常结果和错误码混在一起,一旦出错还需要一层一层的向上报,直到某个函数可以处理这个错误为止。
def do_some(x):
return x / 2
def foo():
r = do_some(-2)
if r == -1:
return -1
return r
def bar():
r = foo()
if r == -1:
print("Error")
else:
print("OK")
bar()
运行结果:
Error
try...except...finally...方式
我们首先将可能会报错的代码放入try中进行运行;
如果执行出错,就会跳转到错误处理代码,也就是except中进行错误处理;
执行完except后如果有finally就会执行,没有就跳出该方法执行剩下的方法。
def foo():
try:
print("try...")
r = 100 / 0
print("return:", r)
except Exception as e:
print("except", e)
finally:
print("finally...")
print("end...")
foo()
运行结果:
try...
except division by zero
finally...
end...
根据上面方法的运行结果我们可以看出,代码由于出错并没有运行print("return:", r),而是直接运行错误代码的处理逻辑。
如果我们这里将代码进行修改的话:
def foo():
try:
print("try...")
r = 100 / 5
print("return:", r)
except Exception as e:
print("except", e)
finally:
print("finally...")
print("end...")
foo()
运行结果:
try...
return: 20.0
finally...
end...
这里我们就会看到错误处理逻辑并没有被执行,是因为try中的代码在运行的时候并没有出现错误。
记录错误
出现错误我们应该及时的记录下来,方便以后进行查询修改。同时我们也需要程序继续向下执行。
import logging
def foo(x):
return x / 0
def main():
try:
foo(100) * 2
except Exception as e:
logging.exception(e)
main()
print("END")
运行结果:
ERROR:root:division by zero
Traceback (most recent call last):
File "D:/WorkSpace/python/test.py", line 65, in main
foo(100) * 2
File "D:/WorkSpace/python/test.py", line 60, in foo
return x / 0
ZeroDivisionError: division by zero
END
可以看到程序在遇到错误的时候打印了错误信息并且直接向下继续执行了。
抛出错误
我们在写程序的时候可能会遇到错误,有时候我们不会在当前代码处进行处理,可能希望向上抛出到合适的位置进行处理。这时候我们就需要将错误向上进行抛出处理。
这里我们就需要用到一个关键词:raise,这个关键词就是可以将我们的错误进行抛出。
def foo(s):
n = int(s)
if n==0:
raise ValueError('invalid value: %s' % s)
return 10 / n
def bar():
try:
foo('0')
except ValueError as e:
print('ValueError!')
raise
bar()
运行结果:
Traceback (most recent call last):
File "D:/WorkSpace/python/test.py", line 88, in
bar()
File "D:/WorkSpace/python/test.py", line 82, in bar
foo('0')
File "D:/WorkSpace/python/test.py", line 76, in foo
raise ValueError('invalid value: %s' % s)
ValueError: invalid value: 0
ValueError!
在这里我们会发现,错误在foo()方法中被捕获,然后向上抛出到bar()方法中进行处理。