python 错误、异常
2016-05-05 00:00
218 查看
python错误分为两种:
1.语法错误:语法错误是程序编写有问题造成的,比如本来应该输入整数结果输入了字符串,这种错误我们通常称之为bug,bug是需要在程序执行前纠正的。2.异常:异常是完全无法在程序运行过程中预测的,对异常的描述是:因程序出现错误而在正常的控制流外采取的行为。如写入文件的时候,磁盘满了,写不进去了,或者从网络抓取数据,网络突然断掉了。这类错误也称为异常,在程序中通常是必须处理的,否则,程序会因为各种问题终止并退出。
错误处理:
1.包括python在内的高级语言通常都内置了一套try...except...finally...的错误处理机制错误。try
try的使用例子:
try: print 'try...' r = 10 / 0 print 'result:', r except ZeroDivisionError, e: print 'except:', e finally: print 'finally...' print 'END'
当某些代码容易出错时,就可以用try来运行这段代码,
1.如果执行出错,则后续代码不会继续执行,而是直接跳转至错误处理代码,即except语句块,执行完except后,如果有finally语句块,则执行finally语句块,至此,执行完毕。
2.如果没有错误发生,所以except语句块不会被执行,但是finally如果有,则一定会被执行(可以没有finally语句)。
注:无论是否有错误,如果存在finally语句,则一定会执行。
2.错误和异常小结
异常 描述
NameError 尝试访问一个没有申明的变量
ZeroDivisionError 除数为0
SyntaxError 语法错误
IndexError 索引超出序列范围
KeyError 请求一个不存在的字典关键字
IOError 输入输出错误(比如你要读的文件不存在)
AttributeError 尝试访问未知的对象属性
ValueError 传给函数的参数类型不正确,比如给int()函数传入字符串形
3.使用try...except捕获错误还有一个好处,就是可以跨越多层调用,比如函数main()调用foo(),foo()调用bar(),结果bar()出错了,这时,只要main()捕获到了,就可以处理:也就是说,不需要在每个可能出错的地方去捕获错误,只要在合适的层次去捕获错误就可以了。可以减少写try语句的次数。
此时:如果在内层中错误没有被捕获,它就会一直往上层抛,最后被Python解释器捕获,打印一个错误信息,然后程序退出。上面的例子就会由bar()--foo()--main()。
4.记录错误
Python内置的logging模块可以非常容易地记录错误信息,通过配置,logging可以把错误记录到日志文件里,方便事后排查。
如果不捕获错误,自然可以让Python解释器来打印出错误堆栈,但程序也被结束了。既然我们能捕获错误,就可以把错误堆栈打印出来,然后分析错误原因,同时,让程序继续执行下去。
import logging def foo(s): return 10 / int(s) def bar(s): return foo(s) * 2 def main(): try: bar('0') except StandardError, e: logging.exception(e) main() print 'END'
同样是出错,但程序打印完错误信息后会继续执行,并正常退出:
$ python err.py ERROR:root:integer division or modulo by zero Traceback (most recent call last): File "err.py", line 12, in main bar('0') File "err.py", line 8, in bar return foo(s) * 2 File "err.py", line 5, in foo return 10 / int(s) ZeroDivisionError: integer division or modulo by zero END
5.触发异常,抛出错误:
错误是class定义的,捕获一个错误就是捕获到该class的一个实例。因此错误是自定义的并在合适的条件下抛出的。Python的内置函数会抛出很多类型的错误,我们自己编写自定义的异常触发(抛出错误)。
如果要抛出错误,首先根据需要,可以定义一个错误的class,选择好继承关系,然后,用raise语句抛出一个错误的实例:
class FooError(StandardError): pass def foo(s): n = int(s) if n==0: raise FooError('invalid value: %s' % s) return 10 / n
执行,可以最后跟踪到我们自己定义的错误:
$ python err.py Traceback (most recent call last): ... __main__.FooError: invalid value: 0
只有在必要的时候才定义我们自己的错误类型。如果可以选择Python已有的内置的错误类型(比如ValueError,TypeError),尽量使用Python内置的错误类型。
相关文章推荐
- python 测试与调试(test)
- Python爬虫: 抓取One网页上的每日一话和图
- python的json模块,针对decimal类型直接dumps报错
- Python文件读写基础
- Python 类与元类的深度挖掘 II
- Python-量化分析之路
- python(二)拾遗
- [Python]经典教程
- python2 type()函数 isinstance()函数
- pythondb操作
- 安装Numpy,Scipy,Matplotlib的步骤及下载地址(亲测有效)
- python效率提升:ctypes的初次使用
- Python之socketserver源码分析
- Python的学习笔记(一)(基础)
- python爬取图片
- my python
- python---基础知识
- scikit-learn学习之SVM算法
- [python]迭代器与生成器
- 理解 Python 的执行方式,与字节码 bytecode 玩耍 (上)