# 在程序运行的过程中,如果发生了错误,可以事先约定返回一个错误代码,这样,就可以知道是否有错,以及出错的原因
#
# # try
# 当我们认为某些代码可能会出错时,就可以用try来运行这段代码,如果执行出错,则后续代码不会继续执行,而是直接跳转至错误处理代码,即except语句块,
# 执行完except后,如果没有错误发生,可以在except语句块后面加一个else,当没有错误发生时,会自动执行else语句,如果有finally语句块,则执行finally语句块,至此,执行完毕。
# ValueError ZeroDivisionError
try:
print('try...')
r = 10 / 2
print('result:', r)
except Exception as e:
print('except:', e)
else:
print('no error!')
finally:
print('finally...')
print('END')
#使用try...except捕获错误还有一个巨大的好处,就是可以跨越多层调用,所有不需要在每个可能出错的地方去捕获错误,只要在合适的层次去捕获错误就可以了
#
#调用栈
#如果错误没有被捕获,它就会一直往上抛,最后被Python解释器捕获,打印一个错误信息,然后程序退出。
#
# 记录错误
# 既然我们能捕获错误,就可以把错误堆栈打印出来,然后分析错误原因,同时,让程序继续执行下去。
# Python内置的logging模块可以非常容易地记录错误信息:
# 通过配置,logging还可以把错误记录到日志文件里,方便事后排查。
import logging
def foo(s):
return 10 / int(s)
def bar(s):
return foo(s) * 2
def main():
try:
bar('0')
except Exception as e:
logging.exception(e)
main()
print('END') # 这里最终会执行,
# 抛出错误
# 首先根据需要,可以定义一个错误的class,选择好继承关系,然后,用raise语句抛出一个错误的实例:
class FooError(ValueError):
pass
def foo1(s):
n = int(s)
if n==0:
raise FooError('invalid value: %s' % s)
return 10 / n
foo1('0')
# 如果可以选择Python已有的内置的错误类型(比如ValueError,TypeError),尽量使用Python内置的错误类型
# 捕获错误目的只是记录一下,便于后续追踪。但是,由于当前函数不知道应该怎么处理该错误,所以,最恰当的方式是继续往上抛,让顶层调用者去处理。
#
# 调试
#
# print() 打印
# assert 断言
# assert n != 0, 'n is zero!' 如果断言失败,assert语句本身就会抛出AssertionError:
# logging
# 它允许你指定记录信息的级别,有debug,info,warning,error等几个级别
# 添加配置logging.basicConfig(level=logging.INFO)
# logging.info()
# pdb
# 第4种方式是启动Python的调试器pdb,让程序以单步方式运行
# python -m pdb err.py
# pdb.set_trace()
# 这个方法也是用pdb,但是不需要单步执行,我们只需要import pdb,然后,在可能出错的地方放一个pdb.set_trace(),就可以设置一个断点:
#
python学习-基础-错误、调试、测试
猜你喜欢
转载自blog.csdn.net/u011342216/article/details/86473450
今日推荐
周排行