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()             #执行所有单元测试