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

8.1 语法错误

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

  1. >>> while True print 'Hello world'
  2. File "<stdin>", line , in ?
  3. while True print 'Hello world'
  4. ^
  5. SyntaxError: invalid syntax

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

  1. >>> while True: print 'Hello world'
  2. ...
  3. Hello world

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

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

8.3 处理异常

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

  1. try:
  2. f = open ('test.txt','r+')
  3. s = f.readline()
  4. i = int(s.strip())
  5. except IOError as e:
  6. print 'I/O error({0}):{1}'.format(e.errno,e.strerror)
  7. except ValueError:
  8. print "could not convert data to integer"
  9. except:
  10. print "unexpected error:",sys.exc_info()[]
  11. else:
  12. print 'there has {0} lines in the file'.format(len(f.readlines()))
  13. finally:
  14. print 'end of the function'
  15. 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__() 定义过了,就可以直接打印出参数了。

  1. >>> try:
  2. ... raise Exception('spam', 'eggs')
  3. ... except Exception as inst:
  4. ... print type(inst) # the exception instance
  5. ... print inst.args # arguments stored in .args
  6. ... print inst # __str__ allows args to be printed directly
  7. ... x, y = inst.args
  8. ... print 'x =', x
  9. ... print 'y =', y
  10. ...
  11. <type 'exceptions.Exception'>
  12. ('spam', 'eggs')
  13. ('spam', 'eggs')
  14. x = spam
  15. y = eggs

8.4 用户自定义异常

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

  1. >>> class MyError(Exception):
  2. ... def __init__(self, value):
  3. ... self.value = value
  4. ... def __str__(self):
  5. ... return repr(self.value)
  6. ...
  7. >>> try:
  8. ... raise MyError(*)
  9. ... except MyError as e:
  10. ... print 'My exception occurred, value:', e.value
  11. ...
  12. My exception occurred, value:
  13. >>> raise MyError('oops!')
  14. Traceback (most recent call last):
  15. File "<stdin>", line , in ?
  16. __main__.MyError: 'oops!'

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

8.5 已定义好的清理行为

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

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

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

  1. with open("myfile.txt") as f:
  2. for line in f:
  3. 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. React native 的弹出层(输入)效果

    /*弹出层测试*/ import React,{Component} from 'react'; import { StyleSheet, View, Image, Text, TouchableOp ...

  2. Ubuntu 14.04 安装pdf阅读器

    1. 个人推荐 okular. 关于安装okular的原因,可以很好的做到护眼功能. Ubuntu 14.04 自带的阅读器,因为白色太刺眼,长时间使用对眼睛不好. 对于,长时间编程的朋友们习惯夜间模 ...

  3. javaScript条件控制语句

    当某段代码的执行,需要首先满足某些条件时,我们就需要用到条件控制语句.判断条件是否满足,满足条件才去执行某些代码. 如判断数组中值等于条件值时,将这个值从数组中删除 a.switch <scri ...

  4. 【RabbitMQ】Publish/Subscribe

    Publish/Subscribe 在上一节我们创建了一个work queue.背后的设想为每个任务被分发给明确的消费者.这节内容我们将做一些完全不同的事情 -- 我们将发送一条消息给多个消费者.这种 ...

  5. 将bean转换成键值列表

    日常开发中在进行接口对接的数据传输时,有一种场景是将bean转成jsonString,这里可以将bean转换成Map再转成jsonString. 工具类如下: public static String ...

  6. [转载] 自定义百度网盘分享密码 (Javascript)

    压缩版 javascript:require(["function-widget-1:share/util/service/createLinkShare.js"]).protot ...

  7. python学习道路(day10note)(线程,进程)

    1.计算机的发展史 看alex的博客吧,了解一下可以了 2.线程与GIL简介 #线程 #一道单一的指令的控制流,寄生在进程中 #单一进程里的多个线程是共享数据的 #多个线程涉及修改共享数据的时候需要枷 ...

  8. H5+微信支付报-1问题

    1.检查发起支付的参数,全部设置为小写: WxPayData jsApiParam = new WxPayData(); jsApiParam.SetValue("appid", ...

  9. python写2048小游戏

    #!/usr/bin/env python # coding=utf-8 #******************************************************** # > ...

  10. cloudera learning6:Hadoop Security

    保证Hadoop安全的最有效方法是对cluster进行隔离(isolation,常用方法是把大集群划分若干个小集群). Hadoop安全措施的目的是防止好的人不小心做了坏的事,而非防止坏人坏事. Ke ...