python至少有2类不同的错误:语法错误(Syntax Errors)和异常(Exceptions)。

8.1 语法错误

这个单词应该还是很有必要认识的,呵呵,语法错误,也叫解析错误,是我们最不愿意发生的错误,直接拿官网的例子:

>>> while True print 'Hello world'
File "<stdin>", line , in ?
while True print 'Hello world'
^
SyntaxError: invalid syntax

语法错误提示时会先打印出现语法的语句然后在这语句中打上‘ ^ ’ 表示离语法错误最近的地方。例子中就是在print前少了引号(这是一个死循环~~):

>>> while True: print 'Hello world'
...
Hello world

8.2 异常
      一个语句或者一个表达式即使编译时是没有语法错误的,但是也有可能在执行时出现问题,这种问题也叫异常(非致命性),异常通常都是有在程序中进行处理的。异常是有不同类型的,常见的异常类型有ZeroDivisionError, NameError and TypeError,这类异常称为标准异常,是在build-in里面定义的,可以查看Built-in Exceptions。还有一类异常是用户自定义的。

>>>  * (/)
Traceback (most recent call last):
File "<stdin>", line , in ?
ZeroDivisionError: integer division or modulo by zero>>> '' +
Traceback (most recent call last):
File "<stdin>", line , in ?
TypeError: cannot concatenate 'str' and 'int' objects

8.3 处理异常

直接给一个比较全的异常处理的例子:打开一个txt文档,读入第一行的数据,转换成int数据类型,如果都成功,就打印txt总共有多少行,最后关闭文档。

    try:
f = open ('test.txt','r+')
s = f.readline()
i = int(s.strip())
except IOError as e:
print 'I/O error({0}):{1}'.format(e.errno,e.strerror)
except ValueError:
print "could not convert data to integer"
except:
print "unexpected error:",sys.exc_info()[]
else:
print 'there has {0} lines in the file'.format(len(f.readlines()))
finally:
print 'end of the function'
f.close()

try语句处理异常,是这样做的:

A. 首选,try子语句(try和except关键字之间的语句)会被执行。

B. 如果没有异常发生,except 子句被略过。

C. 如果有异常发生,try后面的其他语句就被跳过了,如果异常类型在except关键字后匹配,这个except子句被执行。

D. 如果没有异常发生,else子句就会被执行。else的作用是它避免了捕获未保护的代码所发起的异常。

E. finally语会在try子句执行完毕之前执行,不管是否发生或者不发生异常。当一个异常发生在try子句中却未被处理时(或者发生在except或者else子句中时),finally子句执行完后会再次抛出异常。

这些基本的语法,应该也基本都是比较清楚的,文档里列出了一些需要注意的地方:

第一:一次性处理多个异常时,多个异常需要用括号括起来。

except (RuntimeError, TypeError): 这样是正确的;except RuntimeError, TypeError: 写法是错误的,因为except ValueError, e 在语法上等价于except ValueError as e。

第二:最后一个except子句可以不带异常类型名,这样就可以捕获任何未被定义的异常。

第三:当一个异常发生时,可能它还有一些异常的参数。except语句的异常名字后面可以跟一个参数,这个参数会跟异常实例绑定,存储在instance.args中,如果异常中__str__() 定义过了,就可以直接打印出参数了。

>>> try:
... raise Exception('spam', 'eggs')
... except Exception as inst:
... print type(inst) # the exception instance
... print inst.args # arguments stored in .args
... print inst # __str__ allows args to be printed directly
... x, y = inst.args
... print 'x =', x
... print 'y =', y
...
<type 'exceptions.Exception'>
('spam', 'eggs')
('spam', 'eggs')
x = spam
y = eggs

8.4 用户自定义异常

用户自定义的异常需要继承Exception类,官网例子如下:

>>> class MyError(Exception):
... def __init__(self, value):
... self.value = value
... def __str__(self):
... return repr(self.value)
...
>>> try:
... raise MyError(*)
... except MyError as e:
... print 'My exception occurred, value:', e.value
...
My exception occurred, value:
>>> raise MyError('oops!')
Traceback (most recent call last):
File "<stdin>", line , in ?
__main__.MyError: 'oops!'

在这个例子中,init方法被重写了,用于创建一个新的成员变量value。

8.5 已定义好的清理行为

当不再需要这个对象的时候,有一些对象已经定义好了标准的清理行为,不管使用这个对象操作成功或者失败;常见的例子还是打开文档:

for line in open("myfile.txt"):
print line,

这段代码的问题是在这段代码执行后,文档处于open的状态时间是不确定的,在一个小的脚本里,这不会是一个很严重的问题,但是如果是一个大应用程序中的一部分,这个问题就会被放大。使用with语句,就允许一些像files的类在使用完后能被清理完(释放某些资源吧,我是这样理解的):

with open("myfile.txt") as f:
for line in f:
print line,

换成这行代码后,f已经处于close状态了。即使在读文件里的每一行遇到错误,也会关闭掉。

 

python学习笔记系列----(六)错误和异常的更多相关文章

  1. Python学习笔记五:错误与异常

    一:常见异常与错误 BaseException 所有异常的基类SystemExit 解释器请求退出KeyboardInterrupt 用户中断执行(通常是输入^C)Exception 常规错误的基类S ...

  2. python学习笔记16(错误、异常)

    一.什么是错误,什么是异常 错误是指在执行代码过程中发生的事件,它中断或干扰代码的正常流程并创建异常对象.当错误中断流程时,该程序将尝试寻找异常处理程序(一段告诉程序如何对错误做出响应的代码),以帮助 ...

  3. 吴裕雄--天生自然python学习笔记:Python3 错误和异常

    语法错误 Python 的语法错误或者称之为解析错,是初学者经常碰到的,如下实例 >>>while True print('Hello world') File "< ...

  4. python学习笔记(六)文件夹遍历,异常处理

    python学习笔记(六) 文件夹遍历 1.递归遍历 import os allfile = [] def dirList(path): filelist = os.listdir(path) for ...

  5. Python学习笔记(六)

    Python学习笔记(六) Ubuntu重置root密码 Ubuntu 16.4 目录结构 Ubuntu 命令讲解 1. Ubuntu重置root密码 启动系统,显示GRUB选择菜单(如果默认系统启动 ...

  6. PYTHON 100days学习笔记008-4:错误和异常

    目录 Day008_04:python错误和异常 1.语法错误 2.异常 3.异常处理 4.抛出异常 5.用户自定义异常 6.定义清理行为 7.预定义的清理行为 参考文章: python3错误和异常 ...

  7. python学习笔记系列----(一)python简介

    一个月前,就按下决心要系统的学习下python了,虽然之前有学习过java,学习过c++,也能较为熟练的使用java做自动化测试看懂c++里的业务逻辑,但是实际上有那么多的东西自己还是不清楚,今天下定 ...

  8. Python学习笔记系列

    1.小甲鱼 python 学习系列笔记

  9. python学习笔记(六)——程序调试

    在我们平时编写程序时,常常会遇到各种错误,俗称BUG.而我们程序猿的工作常常需要对程序进行调试,也就是所谓的debug. 程序调试是将编制的程序投入实际运行前,用手工或编译程序等方法进行测试,修正语法 ...

  10. python学习笔记系列----(八)python常用的标准库

    终于学到了python手册的最后一部分:常用标准库.这部分内容主要就是介绍了一些基础的常用的基础库,可以大概了解下,在以后真正使用的时候也能想起来再拿出来用. 8.1 操作系统接口模块:OS OS模块 ...

随机推荐

  1. 开源的一些GIS项目下载

    worldwind svn地址: https://nasa-exp.svn.sourceforge.net/svnroot/nasa-exp/trunk/WorldWind dotspatial sv ...

  2. PHP中面向对象的关键字

    php面向对象中常用的关键字有final.static.const (1)final: 1,final不能修饰成员属性 2,final只能修饰类和方法 作用: 使用final修饰的类不能被子类继承 使 ...

  3. ios7迎来完美越狱,果粉狂欢!

    [我要]最近一则iOS7可以完美越狱的消息,可是乐坏了期待已久的果粉们.据科技博客网站Gizmodo报道,越狱专家Evasi0n团队最近攻破苹果的 iOS7系统,赶在圣诞前发布了iOS7的越狱.消息一 ...

  4. BZOJ 2761: [JLOI2011]不重复数字 水题

    2761: [JLOI2011]不重复数字 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2100  Solved: 809 题目连接 http:// ...

  5. java并发编程(十一)线程间的通信notify通知的遗漏

    notify通知的遗漏很容易理解,即threadA还没开始wait的时候,threadB已经notify了,这样,threadB通知是没有任何响应的,当threadB退出synchronized代码块 ...

  6. Oracle数据库字符集试验

    对于初学者我们可以理解字符集就是一种字符编码方式,试想人可以直接语言进行交流,使用文字进行记录,而计算机却不认得我们人类创立的文字,计算机只认得0和1这样的二进制代码.当我们要通过计算机记录文字信息的 ...

  7. 那些年一起用过的iOS开发利器之CocoaPods

    本系列所有工具的简介见:http://www.cnblogs.com/lloydsheng/p/3637606.html CocoaPods是一个负责管理iOS项目中第三方开源代码的工具.CocoaP ...

  8. [转]SQL三种获取自增长的ID方法

     最新更新请访问: http://denghejun.github.io   SQL SERVER中的三种获得自增长ID的方法  这个功能比较常用,所以记下来以防自己忘掉. SCOPE_IDENTIT ...

  9. Unity中使用WebView

    Unity中使用WebView @(设计) 需求,最近游戏中需要引入H5直播页面和更新比较频繁的赛事页面,需求包括:加密传参数.和Unity交互,在Unity框架下其实有几种方案: 内置函数Appli ...

  10. 设置一个顺手的Xcode

    授权转载,作者:吴白(微博) 手指在键盘上飞速跳跃,终端上的代码也随着飞舞,是的这确实很酷.优秀的程序员总是这么一群人,他们不拘于现状,不固步自封,他们喜欢新奇的事,他们把自己发挥到极致. 指法攻略 ...