文档章节

python 错误、异常

clgo
 clgo
发布于 2016/05/05 17:59
字数 1144
阅读 14
收藏 0

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.错误和异常小结

  1. 异常 描述
  2. NameError 尝试访问一个没有申明的变量
  3. ZeroDivisionError 除数为0
  4. SyntaxError 语法错误
  5. IndexError 索引超出序列范围
  6. KeyError 请求一个不存在的字典关键字
  7. IOError 输入输出错误(比如你要读的文件不存在)
  8. AttributeError 尝试访问未知的对象属性
  9. 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内置的错误类型。

© 著作权归作者所有

共有 人打赏支持
clgo
粉丝 3
博文 99
码字总数 37086
作品 0
郑州
私信 提问
Supporting Python 3——不使用2to3转换支持Python 2和Python 3

不使用2to3转换支持Python 2和Python 3 虽然Python 3的官方文档努阴人们写同时支持Python 2和Python 3的代码,但是在一此情况这是合适的。尤其是你不能放弃支持Python 2.5及更早的版本时,因...

在湖闻樟
2015/10/28
0
0
Python3.7最新版本使用说明书,请你保管好!

以下是对Python官网内容的翻译 需要注意的是目前这个版本是Python3.7预计发布的四个预览版本之三。 Python Release Python 3.7.0b3 Python数据类 Python生成器异常处理 在Python 3.7中,生成...

糖宝lsh
2018/12/28
0
0
/root/anaconda2/bin/python: Permission denied ,python执行异常

/root/anaconda2/bin/python: Permission denied ,python执行异常, python执行异常错误, 子用户的 运行root目录下的 python脚本,没有权限,调成了 drwxrwxrwx 20 rcmd1 rcmd1 4096 May 9...

知行合一1
2017/06/08
535
2
学习笔记(11月08日)--异常

四周三次课(11月8日) 异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。 一般情况下,在Python无法正常处理程序时就会发生一个异常。异常是Python对象,表示一个错...

wanyang_wanyang
2018/07/03
0
0
Python 程序员经常犯的 10 个错误

关于Python Python是一种解释性的,面向对象的动态语义高级编程语言。其高层次的内置数据结构,结合动态类型和动态捆绑,及用作脚本或胶水语言来连接现有的组件或服务,使其在快速应用程序开发...

oschina
2014/05/09
19.8K
28

没有更多内容

加载失败,请刷新页面

加载更多

JavaScript继承(二)——借用构造函数

JavaScript继承(一)——原型链中提出原型链继承的两个问题:一是原型的数据共享问题,二是创建子类型的实例时,不能向父类型的构造函数中传递参数。这两个问题的根源还是在于使用原型模式创...

Bob2100
27分钟前
0
0
day25:比较两个文件内容|杀进程|并发备份数据库|并发进程备份mysql库|监控全国CDN网站节点|

1、有两个文件 a.txt 和 b.txt,把 a.txt 中有的但 b.txt 中没有的行找出来,并写入列 c.txt,然后计算 c 的行数; 注释:比较两个文件两个文件不同,可以用的方法:diff md5sum grep -vf $1 $...

芬野de博客
43分钟前
4
0
抓包工具Charles

背景介绍 Charles是一款很实用,界面很友好(至少跟fiddler比起来),功能强大的抓包神器,因为它是基于 java 开发的,所以跨平台,Mac、Linux、Windows下都是可以使用的,并且在Android和i...

Jack088
44分钟前
1
0
徒手撸一个简单的RPC框架

徒手撸一个简单的RPC框架 之前在牛逼哄哄的 RPC 框架,底层到底什么原理得知了RPC(远程过程调用)简单来说就是调用远程的服务就像调用本地方法一样,其中用到的知识有序列化和反序列化、动态...

不学无数的程序员
今天
2
0
Java 面试题目最全集合1000+ 大放送,能答对70%就去BATJTMD试试~

2019,相对往年我们会发现今年猎头电话少了,大部分企业年终奖缩水,加薪幅度也不如往年,选择好offer就要趁早,现在开始准备吧,刷一波Java面试题,能回答70%就去BATJTMD大胆试试~ 以下是2...

mikechen优知
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部