python学习笔记系列----(六)错误和异常
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学习笔记系列----(六)错误和异常的更多相关文章
- Python学习笔记五:错误与异常
一:常见异常与错误 BaseException 所有异常的基类SystemExit 解释器请求退出KeyboardInterrupt 用户中断执行(通常是输入^C)Exception 常规错误的基类S ...
- python学习笔记16(错误、异常)
一.什么是错误,什么是异常 错误是指在执行代码过程中发生的事件,它中断或干扰代码的正常流程并创建异常对象.当错误中断流程时,该程序将尝试寻找异常处理程序(一段告诉程序如何对错误做出响应的代码),以帮助 ...
- 吴裕雄--天生自然python学习笔记:Python3 错误和异常
语法错误 Python 的语法错误或者称之为解析错,是初学者经常碰到的,如下实例 >>>while True print('Hello world') File "< ...
- python学习笔记(六)文件夹遍历,异常处理
python学习笔记(六) 文件夹遍历 1.递归遍历 import os allfile = [] def dirList(path): filelist = os.listdir(path) for ...
- Python学习笔记(六)
Python学习笔记(六) Ubuntu重置root密码 Ubuntu 16.4 目录结构 Ubuntu 命令讲解 1. Ubuntu重置root密码 启动系统,显示GRUB选择菜单(如果默认系统启动 ...
- PYTHON 100days学习笔记008-4:错误和异常
目录 Day008_04:python错误和异常 1.语法错误 2.异常 3.异常处理 4.抛出异常 5.用户自定义异常 6.定义清理行为 7.预定义的清理行为 参考文章: python3错误和异常 ...
- python学习笔记系列----(一)python简介
一个月前,就按下决心要系统的学习下python了,虽然之前有学习过java,学习过c++,也能较为熟练的使用java做自动化测试看懂c++里的业务逻辑,但是实际上有那么多的东西自己还是不清楚,今天下定 ...
- Python学习笔记系列
1.小甲鱼 python 学习系列笔记
- python学习笔记(六)——程序调试
在我们平时编写程序时,常常会遇到各种错误,俗称BUG.而我们程序猿的工作常常需要对程序进行调试,也就是所谓的debug. 程序调试是将编制的程序投入实际运行前,用手工或编译程序等方法进行测试,修正语法 ...
- python学习笔记系列----(八)python常用的标准库
终于学到了python手册的最后一部分:常用标准库.这部分内容主要就是介绍了一些基础的常用的基础库,可以大概了解下,在以后真正使用的时候也能想起来再拿出来用. 8.1 操作系统接口模块:OS OS模块 ...
随机推荐
- React native 的弹出层(输入)效果
/*弹出层测试*/ import React,{Component} from 'react'; import { StyleSheet, View, Image, Text, TouchableOp ...
- Ubuntu 14.04 安装pdf阅读器
1. 个人推荐 okular. 关于安装okular的原因,可以很好的做到护眼功能. Ubuntu 14.04 自带的阅读器,因为白色太刺眼,长时间使用对眼睛不好. 对于,长时间编程的朋友们习惯夜间模 ...
- javaScript条件控制语句
当某段代码的执行,需要首先满足某些条件时,我们就需要用到条件控制语句.判断条件是否满足,满足条件才去执行某些代码. 如判断数组中值等于条件值时,将这个值从数组中删除 a.switch <scri ...
- 【RabbitMQ】Publish/Subscribe
Publish/Subscribe 在上一节我们创建了一个work queue.背后的设想为每个任务被分发给明确的消费者.这节内容我们将做一些完全不同的事情 -- 我们将发送一条消息给多个消费者.这种 ...
- 将bean转换成键值列表
日常开发中在进行接口对接的数据传输时,有一种场景是将bean转成jsonString,这里可以将bean转换成Map再转成jsonString. 工具类如下: public static String ...
- [转载] 自定义百度网盘分享密码 (Javascript)
压缩版 javascript:require(["function-widget-1:share/util/service/createLinkShare.js"]).protot ...
- python学习道路(day10note)(线程,进程)
1.计算机的发展史 看alex的博客吧,了解一下可以了 2.线程与GIL简介 #线程 #一道单一的指令的控制流,寄生在进程中 #单一进程里的多个线程是共享数据的 #多个线程涉及修改共享数据的时候需要枷 ...
- H5+微信支付报-1问题
1.检查发起支付的参数,全部设置为小写: WxPayData jsApiParam = new WxPayData(); jsApiParam.SetValue("appid", ...
- python写2048小游戏
#!/usr/bin/env python # coding=utf-8 #******************************************************** # > ...
- cloudera learning6:Hadoop Security
保证Hadoop安全的最有效方法是对cluster进行隔离(isolation,常用方法是把大集群划分若干个小集群). Hadoop安全措施的目的是防止好的人不小心做了坏的事,而非防止坏人坏事. Ke ...