1.使用try-catch-finally
try:
print('try...')
r = 10 / 0
print('result:', r)
except ZeroDivisionError as e:
print('except:', e)
finally:
print('finally...')
print('END')
2.使用logging记录出错信息
#==============使用logging记录错误,可以"打印错误堆栈信息"同时使得程序继续执行====
import logging
try:
print('try...')
r = 10 / 0
print('result:', r)
except Exception as e:
logging.exception(e)
finally:
print('finally...')
print('END')
# log的级别有debug,info,warning,error 四钟级别,尅根据不同级别来输出信息,比使用assert和print来调试要科学好用
logging.basicConfig(level=logging.INFO) # 配置下logging使得其支持输出屏幕信息
class Foo(object):
'这是一个会出错的程序,用于复习使用异常处理'
def foo(self, s):
n = int(s)
if n == 0:
raise ValueError('invalid value: %s' % s)
return 10 / n
def bar(self):
try:
self.foo('0')
except ValueError as e:
print('ValueError!')
logging.info("出错啦!!")
logging.exception(e)
# raise
f = Foo()
f.bar()
print('END')
3.自定义异常、抛出异常
#=============自己抛出错误,会导致后面的程序不运行=================
class FooError(ValueError):
pass
def foo(s):
n = int(s)
if n==0:
raise FooError('invalid value: %s' % s) # 自己抛出错误
return 10 / n
foo('0')
4.使用断言
#===============使用断言来代替print===========
def fooAssertion(s):
n = int(s)
assert n != 0, 'n为0,出错!'
return 10 / n
def main():
print('fooAssertion')
fooAssertion('0')
main()
5.PDB
5.1 使用断电
pdb.set_trace() # 程序运行到这里会自动进入PDB
5.2 PDB使用
n:执行下一步
p 变量名:查看变量值
q:退出
6.单元测试
__author__ = 'Kaiming'
import logging
# log的级别有debug,info,warning,error 四钟级别,尅根据不同级别来输出信息,比使用assert和print来调试要科学好用
logging.basicConfig(level=logging.INFO) # 配置下logging使得其支持输出屏幕信息
class Foo(object):
'这是一个会出错的程序'
def foo(self, s):
n = int(s)
if n == 0:
raise ValueError('invalid value: %s' % s)
return 10 / n
def bar(self):
try:
self.foo('0')
except ValueError as e:
print('ValueError!')
logging.info("出错啦!!")
logging.exception(e)
# raise
import unittest # 使用inittest模块 进行单元测试
class Test_Foo(unittest.TestCase): #继承unittest.TestCase
'这是一个测试程序'
def test_bar(self): #名字以test_xxx命名
f = Foo()
f.bar()
self.assertRaises(ValueError)
class TestDict(unittest.TestCase): #适合数据库连接和释放。。
def setUp(self): #setUp方法可以让你任意一个test_xxx方法使用前都使用setUp方法
print('setUp...')
def tearDown(self): #tearDwwn方法可以让你任意一个test_xxx方法使用结束后使用tearDown方法
print('tearDown...')
if __name__ == '__main__': #__name__ == '__main__'表示直接通过python xx.py来运行该文件而不是通过import
unittest.main() #执行所有单元测试