Python 异常、错误

1 错误处理

1.1 捕获错误
try:
    r = 10 / 0
    print('result:', r)
except ZeroDivisionError as e:
    print('except:', e)
finally:
    print('finally...')
print('end')

# 结果:
except: division by zero
finally...
end

如果没有错误发生,可以在except语句块后面加上一个else,当没有错误发生时,会自动执行else语句。

try:
    r = 10 / 2
    print('result:', r)
except ZeroDivisionError as e:
    print('except:', e)
else:
    print('no error')
finally:
    print('finally...')
print('end')

# 结果:
result: 5.0
no error
finally...
end

注意:

  • 如果except有多个异常类,则只会捕获到父类的异常,属于这个父类的子类异常不会被捕获到。
  • 如果错误没有被捕获,它就会一直往上抛,最后被Python解释器捕获,打印出一个错误学习,然后程序退出。
1.2 记录错误
import logging

try:
    r = 10 / 0
    print('result:', r)
except ZeroDivisionError as e:
    # 记录错误
    logging.exception(e)
finally:
    print('finally...')
print('end')

注意:出错后,程序打印完错误信息会继续执行,并正常退出。

1.3 抛出错误
# 定义一个错误的class,选择好继承关系
class FooError(ValueError):
    pass

def foo(s):
    n = int(s)
    if n == 0:
        # 抛出异常
        raise FooError('invalid value: %s' % s)
    return 10 / n

foo('0')

# 结果:最后能追踪到自定义的错误
Traceback (most recent call last):
  File "/Users/Mac/Documents/workspace/pycharm-ws/LearnPro/exception.py", line 28, in <module>
    r = 10 / 0
ZeroDivisionError: division by zero
Traceback (most recent call last):
  File "/Users/Mac/Documents/workspace/pycharm-ws/LearnPro/exception.py", line 52, in <module>
    foo('0')
  File "/Users/Mac/Documents/workspace/pycharm-ws/LearnPro/exception.py", line 48, in foo
    raise FooError('invalid value: %s' % s)
__main__.FooError: invalid value: 0

注意:在except中抛出一个error,可以把一种类型的错误转换成另一种类型,只要是合理的转换逻辑就行。

try:
    10 / 0
except ZeroDivisionError:
    raise ValueError('input error')

2 调试

2.1 断言
def fee(s):
    n = int(s)
    assert n != 0, 'n is zero!'
    return 10 / n

def main():
    fee('0')

main()

# 运行结果:
Traceback (most recent call last):
  File "/Users/Mac/Documents/workspace/pycharm-ws/LearnPro/exception.py", line 73, in <module>
    main()
  File "/Users/Mac/Documents/workspace/pycharm-ws/LearnPro/exception.py", line 70, in main
    fee('0')
  File "/Users/Mac/Documents/workspace/pycharm-ws/LearnPro/exception.py", line 65, in fee
    assert n != 0, 'n is zero!'
AssertionError: n is zero!

注意:

  • 如果断言失败,assert语句本身就会抛出AssertionError。
  • 启动Python解释器时可以用 -0 参数来关闭 assert。
2.2 logging

logging不会抛出错误,而且可以输出到文件。

import logging
# 指定记录信息的级别
logging.basicConfig(level=logging.INFO)

s = '0'
n = int(s)
# 可以输出一段文本
logging.info('n=%d' % n)
print(10 / n)

# 结果:
INFO:root:n=0
Traceback (most recent call last):
  File "/Users/Mac/Documents/workspace/pycharm-ws/LearnPro/exception.py", line 81, in <module>
    print(10 / n)
ZeroDivisionError: division by zero

注意:

  • logging允许指定记录信息的级别,有debug,info,warning,error等,当指定level=INFO时,logging.debug就不起作用了,同理其他也是。
2.3 pdb

不作介绍

2.4 使用IDE

使用PyCharm来开发,支持调试功能。

3 单元测试

单元测试,是用来对一个模块,一个函数或一个类来进行正确性检验的测试工作。

4 文档测试

猜你喜欢

转载自blog.csdn.net/lihaogn/article/details/81267639