Python的异常处理
来源:互联网 发布:表妹 网络词 什么意思 编辑:程序博客网 时间:2024/06/05 22:34
常见错误
1.ZeroDivisionError(零除错误)
In [1]: 10/0---------------------------------------------------------------------------ZeroDivisionError Traceback (most recent call last)<ipython-input-1-242277fd9e32> in <module>()----> 1 10/0ZeroDivisionError: integer division or modulo by zero
2.IOError(文件错误)
In [2]: open('hello')---------------------------------------------------------------------------IOError Traceback (most recent call last)<ipython-input-2-9834044a9e14> in <module>()----> 1 open('hello')IOError: [Errno 2] No such file or directory: 'hello'
3.SyntaxError(语法错误)
In [3]: for i in [1,2,3] File "<ipython-input-3-ae71676907af>", line 1 for i in [1,2,3] ^SyntaxError: invalid syntax
4.IndexError(索引错误)
In [4]: t = (1,2,3)In [5]: t[3]---------------------------------------------------------------------------IndexError Traceback (most recent call last)<ipython-input-5-7d5cf04057c5> in <module>()----> 1 t[3]IndexError: tuple index out of range
5.KeyError(字典的key错误)
In [7]: d = {'name':'cici'}In [8]: d['name']Out[8]: 'cici'In [9]: d['age']---------------------------------------------------------------------------KeyError Traceback (most recent call last)<ipython-input-9-39d5d5cefe61> in <module>()----> 1 d['age']KeyError: 'age'
6.NameError(名称错误)
In [10]: print a---------------------------------------------------------------------------NameError Traceback (most recent call last)<ipython-input-10-9d7b17ad5387> in <module>()----> 1 print aNameError: name 'a' is not defined
错误排查
捕获异常
python异常处理机制: try….except…finally…
如果异常则执行except后的语句,没有异常则直接跳过,也可以用else来提示没有异常
finally后的语句是必然执行的,不管try后的语句是否正确
1.已知错误(跳过错误继续执行)
#!/usr/bin/env python# coding:utf-8_author_ = "lvah"try: #用 try 来运行可能会出错的代码 print 'starting...' li = [1, 2, 3] print a print li[3]except IndexError: #用except来捕获错误,如果异常则执行 print 'index out of list'except NameError,e: #捕获第二个错误,同时给错误赋值 print efinally: #必执行的 print 'ending..'
2.未知错误
#!/usr/bin/env python# coding:utf-8_author_ = "lvah"try: print 'starting...' li = [1, 2, 3] print a print li[3]except BaseException,e: #BaseException是一个错误的父类,表示所有错误 print 'Error:%s'%eelse: print 'no error'finally: print 'ending..'
3.没有异常的情况
#!/usr/bin/env python# coding:utf-8_author_ = "lvah"try: print 'starting...' li = [1, 2, 3] li.append(4) a = 1 print a print li[3]except IndexError: #检测第一个错误 print 'index out of list'except NameError: #检测第二个错误 print 'name is not defined'else: #没有异常时 print 'no error'finally: print 'ending..'
4.函数排错
直接在主函数里排错,可以增强排错效率
#!/usr/bin/env python# coding:utf-8_author_ = "lvah"def func1(s): return func2(s) * 2def func2(s): return 20 / sdef main(): try: print func1('10') except BaseException, e: print emain()
5.错误日志
#!/usr/bin/env python# coding:utf-8_author_ = "lvah"import logging ##导入日志模块logging.basicConfig(filename='err.log') #日志文件的定义def func1(s): return func2(s) * 2def func2(s): return 20 / sdef main(): try: print func1('10') except Exception as e: logging.exception(e) #所有错误导入到日志文件main()
抛出异常
except: 捕获异常
raise: 抛出异常
#!/usr/bin/env python# coding:utf-8_author_ = "lvah"class MyError(BaseException): passa = 1if a == 1: raise MyError
#!/usr/bin/env python# coding:utf-8_author_ = "lvah"class MyError(BaseException): passdef func1(s): return func2(s) * 2def func2(s): return 20 / int(s)def main(): try: print func1('0') except ZeroDivisionError as e: raise MyError #ZeroDivisionError 转换为 MyErrormain()
调试
用 print 把可能有问题的变量打印出来
用 print 最大的坏处是将来还得删掉它,运行结果也会包含很多垃圾信息。
断言
凡是用 print 来辅助查看的地方,都可以用断言(assert)来替代:;
如果断言失败, assert 语句本身就会抛出 AssertionError
#!/usr/bin/env python# coding:utf-8_author_ = "lvah"def foo(s): n = int(s) return 10 / ndef main(): foo('0')assert foo(5) == 2print 'right'
Python 解释器执行时可以用 -O 参数来关闭 assert,把所有的 assert 语句当成 pass。
[kiosk@foundation32 date7.15]$ python -O error_4.py
logging
logging 不会抛出错误,而且可以输出到文件
logging.info() 就可以输出一段文本到日志文件中
#!/usr/bin/env python# coding:utf-8_author_ = "lvah"import logginglogging.basicConfig(filename='logging.log',level=logging.INFO)def foo(s): # 日志级别:debug,info,waring,error n = int(s) logging.info('n=%d'%n) logging.warning('n=%d....warn'%n) return 10 / ndef main(): foo('10')main()
pdb
[kiosk@foundation32 date7.15]$ python -m pdb error_3.py
n – next
p 变量 – 取出变量
q – 退出
#!/usr/bin/env python# coding:utf-8_author_ = "lvah"import pdbn1 =1n = int(n1)print npdb.set_trace() #在可能出错的地方放一个 pdb.set_trace() ,就可以设置一个断点print 'hello'pdb.set_trace()s = 2print s
python …
程序会自动在 pdb.set_trace() 暂停并进入 pdb 调试环境, p 查看变量, c 继续运行
- python的异常处理
- python的异常处理
- Python的异常处理
- python的异常处理
- Python的异常处理
- Python的异常处理
- python异常的处理
- python的异常处理
- Python的异常处理
- Python的异常处理
- Python的异常处理
- python 异常的处理
- Python的异常处理
- python的异常处理机制
- Python的异常处理机制
- python的异常处理流程
- Python的异常处理机制
- python的异常处理机制
- 小结守护进程
- haproxy+keepalived实现高可用负载均衡
- 1035. Password (20)
- 博客推荐
- View的事件分发机制
- Python的异常处理
- 1.1算法研究-动态规划
- 从零开始写javaweb框架笔记21-使框架具备AOP特性-ThreadLocal简介
- go httpClient 好坑
- Codeforces Round #424 (Div. 2) B. Keyboard Layouts(字符串处理)
- hdu1171(01背包问题)
- 动态构建顺序表,及顺序表的插入删除算法(C语言)
- solrJ的使用以及solr集群的搭建
- Linux终端am命令用法