文档章节

python 错误、异常

clgo
 clgo
发布于 2016/05/05 17:59
字数 1144
阅读 11
收藏 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
粉丝 2
博文 92
码字总数 36496
作品 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
Python2.x与3.x版本区别

Python的3.0版本,常被称为Python 3000,或简称Py3k。相对于Python的早期版本,这是一个较大的升级。 为了不带入过多的累赘,Python 3.0在设计的时候没有考虑向下相容。 许多针对早期Python版...

Airship
2015/11/12
0
0
python3.x与python2.x的区别汇总

python3.x与python2.7.x都是比较流行的版本,虽然建议现在的初学者开始学习python3.x的版本,但是还有很多的工程使用的是python2.7.x版本。观看代码的时候难免会出现一些问题。 在google上搜...

oldpan
2017/10/10
0
0
学习笔记(11月08日)--异常

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

wanyang_wanyang
07/03
0
0
python获取系统命令的返回值 | curl in python

项目背景: 通过curl 命令 从服务器获取数组,tids,然后导入到Mysql 表中。 自己想的方案: shell命令不熟悉,另外python中的数据库等接口都已封装,所以想使用Python来做,利用Python调用s...

王二铁
2013/09/07
0
2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

文件的压缩与解压(linux)

Linux下*.tar.gz文件解压缩命令 1.压缩命令:   命令格式:tar -zcvf 压缩后文件名.tar.gz 被压缩文件名 可先切换到当前目录下。压缩文件名和被压缩文件名都可加入路径。 2.解压缩命令: ...

qimh
29分钟前
1
0
invalid character found in the request target 异常

这个异常时因为Tomcat 9不支持请求格式出现“{”等非法字符的问题 因为tomcat版本问题遇到的坑,记录一下。 问题 今天由于要测试一下订单详情页的异步查询,在本地起了一个服务,发送的请求是...

edwardGe
34分钟前
3
0
发现抓包软件fiddler的bug

1个请求他跳转之后,直接400,被拦在了Apache,使用fiddler 的,replay requests 是同样的结果,但是replay composer确是正常的。 也就是说这replay requests 是发原来的包,replay composer...

NLGBZJ
44分钟前
1
0
linux screen 命令详解

shell关闭后, 主机仍然运行 screen命令 启动jenkins以后, screen, 然后按ctrl+a 再按d 这样暂停了子界面, 这时候回到了父界面 用screen –ls查看目前子界面的状态 [root@free /]# screen -l...

SuShine
44分钟前
2
0
mac机器切换无线网络导致网页不能打开的问题

问题: 公司和家里使用不同的WI-FI,每次从家到公司时自动切换网络后,公司的许多地址不能访问, ping域名是可以ping同的,但是网页却打不开... 问题分析: 初步猜想是DNS缓存的问题? 对于MAC系统没...

Lennie002
47分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部