Python——追加学习笔记(三)
错误与异常
- AttributeError:尝试访问未知的对象属性
eg.
>>> class myClass(object):
... pass
...
>>> my = myClass()
>>> my.name = 'Yanta'
>>> my.name
'Yanta'
>>> my.age
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'myClass' object has no attribute 'age'
检测与处理异常
异常通过try语句检测,任何在try语句块里的代码都会被检测,检查有无异常发生
try语句有两种主要形式:try-except和try-finally. 这两个语句是互斥的,也就是说你只能使用其中的一种。一个try语句可以对应一个或者多个except语句,但是只能对应一个finally语句,或者一个try-except-finally复合语句。
也就是说:以下三种形式任选其一。
1、try-except
2、try-finally
3、try-except-finally
其中可以使用try-except语句检测和处理异常,也可以添加一个可选的else子句处理没有探测到异常的执行的代码。
try-finally只允许检测异常并作一些必要的清除工作(无论发生错误与否),没有任何异常处理措施。
复合语句,两者都可以做到。
try-except
try-except语句定义了进行异常监控的一段代码,并且提供了异常处理的机制。
语法形式:
try:
try_suite #监控这里的异常
except Expection[, reason]:
expect_suite #异常处理代码
eg.
>>> try:
... os.remove('test01.log')
... except IOError, e:
... print 'Could not remove the file:', e
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
OSError: [Errno 2] No such file or directory: 'test01.log' #异常报错
处理多个异常的try-except语句:
>>> try:
... os.remove('test01.log')
... except OSError, e:
... print 'No such file or directory: ', e
... except TypeError, e:
... print 'Type argument Error: ', e
...
No such file or directory: [Errno 2] No such file or directory: 'test01.log'
捕获所有异常
1、有些异常不是由于错误条件引起的,比如:SystemExit(当前的python程序需要退出)和KeyboardInterupt(用户按下了Ctrl+C组合键)
2、python2.5之后python异常的继承发生了变化:
- BaseException
| - KeyboardInterupt
| - SystemExit
| - Exception
| - (all other current built-in exceptions)所有当前内建异常
这样,当你有一个Exception处理器后,你不必为这两个一场创建额外的处理器。
try:
:
except Exception, e:
# handle real errors
如果你确实需要捕捉所有的异常,那么就需要使用BaseException:
try:
:
except BaseException, e:
# handle real errors
切记
不要再try_suite语段填写入一大段代码,再用一个通用的except语句过滤掉任何致命的错误,忽略他们。
try-except语句不是用来捕捉过滤所有错误然后忽略他们。
异常参数
实际上就是保存引发异常的具体信息,一般为我们上述书写的try-except与剧中的e:
>>> try:
... os.remove('test01.log')
... except OSError, e:
... print 'No such file or directory: ', e
... except TypeError, e:
... print 'Type argument Error: ', e
...
No such file or directory: [Errno 2] No such file or directory: 'test01.log'
这个e是OSError异常类的实例,可以调用他的一些属性来得到详细信息。也可以调用内置的type()、str()来显示信息:
>>> type(e)
<type 'exceptions.OSError'>
>>> str(e)
"[Errno 2] No such file or directory: 'test01.log'"
>>> print e
[Errno 2] No such file or directory: 'test01.log'
>>> e
OSError(2, 'No such file or directory')
>>> e.__class__
<type 'exceptions.OSError'>
>>> e.__class__.__doc__
'OS system call failed.'
>>> e.__class__.__name__
'OSError'
else语句
在try-except语句段中,else语句只有在try范围中没有异常被检测到时,才会被执行。而且在else范围的任何代码被运行前,try范围的所有代码必须被完全执行成功。不能引发异常。
语句格式:
try:
try_suite
except :
except_suite
else:
else_suite
finally语句
finally语句是无论异常是否发生,是否捕捉都会执行的一段代码。你也可以将finally语句仅仅和try配合使用,也可以与try-except语句配合使用。
其中try-finally语句是无论异常是否发生,finally代码段都会被执行。
当try代码段引发一个异常时,会马上跳转到finally语句段,然后当finally代码段被执行完毕后会继续向上一层引发异常:
>>> try:
... os.remove('test01.log')
... finally:
... print '无论如何这里都会被执行!'
...
无论如何这里都会被执行!
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
OSError: [Errno 2] No such file or directory: 'test01.log'
切记
若果finally代码段引发了另一个异常或者由于return、break、continue语法而终止,原来的异常将丢失而且无法重新引发。
>>> try:
... os.remove('test01.log')
... finally:
... os.rmdir('test')
...
Traceback (most recent call last):
File "<stdin>", line 4, in <module>
OSError: [Errno 2] No such file or directory: 'test'
>>>
上下文管理
with语句是用来简化代码的,这与用try-except和try-finally福哦想达到的目的前后呼应。try-except和try-finally的一种特定的配合用法是保证共享的资源的唯一分配,并在任务结束时候释放它。比如文件(数据、日志、数据库等)、线程资源、简单同步、数据库连接,等等。with语句的目的就是应用在这种场景。
然而,with语句的目的在于从流程图中巴try、except和fianlly关键字和资源分配释放相关代码统统去掉,而不是像try-except-finally那样仅仅简化代码为之所用。
基本语法如下:
with context_expr [as var]:
with_suite
with语句涉及到一些内在的处理细节。with语句仅仅支持上下文管理协议的对象,只有内建了“上下文管理”的对象可以和with一起工作。目前支持该协议的对象有:
* file
* decimal.Context
* thread.LockType
* thread.Lock
* thread.RLock
* thread.Condition
* thread.Semaphore
* thread.BoundedSemaphore
一打开文件为例,with语句会完成准备工作,当完成操作后,会关闭文件。而且无论在这段代码的开始、中间和结尾是发生日常,都会执行清理的代码,此外文件仍会自动关闭。eg.
>>> with open('test.log', 'r') as f0:
... for eachline in f0:
... print eachline
...
121
weqefse
1rfewf
1rfegvd
1rfvfdfsv cb
fsdvfvc
现在我们来测试f0:
>>> f0
<closed file 'test.log', mode 'r' at 0x7fbe66a25300>
>>> type(f0)
<type 'file'>
>>> f0.closed #文件是否被关闭
True
>>> f0.name
'test.log'
>>> f0.mode
'r'
与正常代开文件做对比:
>>> ff = open('test.log', 'r')
>>> type(ff)
<type 'file'>
>>> ff.closed #文件是否被关闭
False
>>> ff.name
'test.log'
>>> ff.mode
'r'
>>> ff.close()
>>> ff
<closed file 'test.log', mode 'r' at 0x7fbe66a25420>
>>> type(ff)
<type 'file'>
>>> ff.name
'test.log'
>>> ff.mode
'r'
>>> ff.closed #文件是否被关闭
True
触发异常
Python提供一种机制让程序员明确的触发异常,这就是raise语句。
raise语句的一般用法:
raise [SomeException [, args [, traceback]]]
raise语句的用法列表:

断言
断言是一套必须等价于布尔真的判定;此外发生异常也就意味着表达式为假。
断言通过assert语句来实现,测试一个表达式,如果返回值为假,则触发异常。
assert语句语法格式:
assert expression [, arguments]
示例:
>>> assert 1 == 0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError
>>> try:
... assert 1 == 0
... except AssertionError, e:
... e
...
AssertionError()
python内建异常
BaseException #所有异常的基类
SystemExit #解释器请求退出
KeyboardInterrupt #用户中断执行(通常是输入^C)
Exception #常规错误的基类
StopIteration #迭代器没有更多的值
GeneratorExit #生成器(generator)发生异常来通知退出
StandardError #所有的内建标准异常的基类
ArithmeticError #所有数值计算错误的基类
FloatingPointError #浮点计算错误
OverflowError #数值运算超出最大限制
ZeroDivisionError #除(或取模)零 (所有数据类型)
AssertionError #断言语句失败
AttributeError #对象没有这个属性
EOFError #没有内建输入,到达EOF 标记
EnvironmentError #操作系统错误的基类
IOError #输入/输出操作失败
OSError #操作系统错误
WindowsError #系统调用失败
ImportError #导入模块/对象失败
LookupError #无效数据查询的基类
IndexError #序列中没有此索引(index)
KeyError #映射中没有这个键
MemoryError #内存溢出错误(对于Python 解释器不是致命的)
NameError #未声明/初始化对象 (没有属性)
UnboundLocalError #访问未初始化的本地变量
ReferenceError #弱引用(Weak reference)试图访问已经垃圾回收了的对象
RuntimeError #一般的运行时错误
NotImplementedError #尚未实现的方法
SyntaxError Python #语法错误
IndentationError #缩进错误
IndentationError #缩进错误
IndentationError #缩进错误
TabError #Tab 和空格混用
SystemError #一般的解释器系统错误
TypeError #对类型无效的操作
ValueError #传入无效的参数
UnicodeError #Unicode 相关的错误
UnicodeDecodeError #Unicode 解码时的错误
UnicodeEncodeError #Unicode 编码时错误
UnicodeTranslateError #Unicode 转换时错误
Warning #警告的基类
DeprecationWarning #关于被弃用的特征的警告
FutureWarning #关于构造将来语义会有改变的警告
OverflowWarning #旧的关于自动提升为长整型(long)的警告
PendingDeprecationWarning #关于特性将会被废弃的警告
RuntimeWarning #可疑的运行时行为(runtime behavior)的警告
SyntaxWarning #可疑的语法的警告
UserWarning #用户代码生成的警告
异常与sys模块
另一种获取异常信息的途径是通过sys模块的exc_info()函数,其提供一个三元组的信息。
>>> try:
... float('ada1313')
... except:
... import sys
... exc_tuple = sys.exc_info()
...
>>> print exc_tuple
(<type 'exceptions.ValueError'>, ValueError('could not convert string to float: ada1313',), <traceback object at 0x7fa699bfc908>)
这个三元组中包含着三个信息:
1、异常类
2、异常类的实例
3、跟踪记录对象
Python——追加学习笔记(三)的更多相关文章
- 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL
周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...
- Python——追加学习笔记(四)
函数 1.python里的函数可以返回一个值或者对象,知识在返回一个容器对象的时候有点不同,看起来像是能返回多个对象. >>> def bar(): ... return 'abc' ...
- Python——追加学习笔记(一)
映射.字典 ## 映射类型内建函数 * dict Error: Python核心编程(第二版)p170 >>> dict([['x', 1], ['y', 2]]) {'y': 2, ...
- python 3 学习笔记 (三)
1. 字典 定义:{key1:value1,key2:value2},key-value结构,key必须可hash特性:1.可存放多个值2.可修改指定key对应的值,可变3.无序 1.1. 创建字典 ...
- 【Python】学习笔记三:序列
sequence(序列) sequence(序列)是一组有序的元素的集合,序列可以有任何元素,也可以没有元素 元组与表的区别:一旦建立,tuple的各个元素不可再变更,而list的各个元素可以再变更 ...
- Python爬虫学习笔记(三)
Cookies: 以抓取https://www.yaozh.com/为例 Test1(不使用cookies): 代码: import urllib.request # 1.添加URL url = &q ...
- Python——追加学习笔记(二)
文件处理 # 文件内移动 seek()方法可以在文件中移动文件指针到不同的位置,offset字节代表相对于某个位置偏移量,默认为0,代表从文件开头算起,1代表从当前位置算起,2代表从文件末尾算起. s ...
- NumPy学习笔记 三 股票价格
NumPy学习笔记 三 股票价格 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.&l ...
- 0003.5-20180422-自动化第四章-python基础学习笔记--脚本
0003.5-20180422-自动化第四章-python基础学习笔记--脚本 1-shopping """ v = [ {"name": " ...
随机推荐
- HDU 6336 (规律 + 二维矩阵的前缀和妙用)
题目 给出长度为n 的A矩阵 , 按 int cursor = 0; for (int i = 0; ; ++i) { for (int j = 0; j <= i; ++j) { M[j][i ...
- HDU - 2087 求不可重复字符串的匹配次数
只要KMP里对f[i]进行限制即可 /*H E A D*/ int nxt[maxn],f[maxn],ans; char T[maxn],P[maxn]; void buildNext(){ int ...
- 使用xcode测量ios8.1机型时的项目兼容问题
打开xcode,创建一个新项目 点击左上角的三角形打开模拟器,打开模拟器中的safari,把项目链接输入,即可测试 下面为切换机型的方法:
- Unix或Linux中&、jobs、fg、bg等命令的使用方法
[From] http://blog.sina.com.cn/nenutechnology fg.bg.jobs.&.ctrl + z都是跟系统任务有关的,虽然现在基本上不怎么需要用到这些命令 ...
- 爬虫之re块解析
一.re 这个去匹配比较麻烦,以后也比较少用,简单看一个案例就行 ''' 爬取数据流程: 1.指定url 2.发起请求 3.获取页面数据 4.数据解析 5.持久化存储 ''' import reque ...
- Robot Framework变量的使用技巧
1.变量的使用 变量可以在命令行中设置,个别变量设置使用--variable (-v)选项,变量文件的选择使用--variablefile (-V)选项.通过命令行设置的变量是全局变量,对其所有执行的 ...
- Python中.ini文件使用
.ini文件 一般用来配置常量或者数据库链接语句等,是纯文本格式,所以可以用纯文本编辑器来编辑其内容. ;文件格式如下 ;注释用分号开头,setion 节 [setion] key = value s ...
- 阿里云服务器对外开放tomcat端口访问
今天第一次在阿里云服务器ecs上安装完成tomcat,然后启动tomcat之后.在本地输入ip:端口,发现不能访问. 出现这个的原因可能是你购买的服务器是 专有网络 类型的 如果是专有网络类型的服务器 ...
- [實現DDD] 第11章 工廠
創建過程中須考慮一些重要細節, 否則所創建的聚合將處於不正確的狀態, 使用適當的工廠方法可以確保這一點, 而客戶端只需輸入基本的參數(通常是值對象), 另外, 工廠能更好地表達出通用語言, 使團隊成員 ...
- 【VirtualBox】快照
一.快照备份 虚拟机系统快照下来,以后就可以恢复到快照之前的系统 右上角->虚拟电脑工具->快照