python学习笔记——异常
转自 http://www.cnblogs.com/rubylouvre/archive/2011/06/22/2086644.html
Python内建异常体系结构
BaseException + - - SystemExit + - - KeyboardInterrupt + - - GeneratorExit + - - Exception + - - StopIteration + - - StandardError | + - - BufferError | + - - ArithmeticError | | + - - FloatingPointError | | + - - OverflowError | | + - - ZeroDivisionError | + - - AssertionError | + - - AttributeError | + - - EnvironmentError | | + - - IOError | | + - - OSError | | + - - WindowsError (Windows) | | + - - VMSError (VMS) | + - - EOFError | + - - ImportError | + - - LookupError | | + - - IndexError | | + - - KeyError | + - - MemoryError | + - - NameError | | + - - UnboundLocalError | + - - ReferenceError | + - - RuntimeError | | + - - NotImplementedError | + - - SyntaxError | | + - - IndentationError | | + - - TabError | + - - SystemError | + - - TypeError | + - - ValueError | + - - UnicodeError | + - - UnicodeDecodeError | + - - UnicodeEncodeError | + - - UnicodeTranslateError + - - Warning + - - DeprecationWarning + - - PendingDeprecationWarning + - - RuntimeWarning + - - SyntaxWarning + - - UserWarning + - - FutureWarning + - - ImportWarning + - - UnicodeWarning + - - BytesWarning |
- try
- 捕获由Python或程序本身引发的异常
- raise
- 手工地引发一个异常
为什么要使用异常
- 错误处理,当python检查以程序运行时的错误就引发异常,你可以在程序里捕捉和处理这些错误,或者忽略它们。
- 事件通知,异常也可以作为某种条件的信号,而不需要在程序里传送结果标志或显式地测试它们。
- 特殊情形处理,有时有些情况是很少发生的,把相应的处理代码改为异常处理会更好一些。
- 奇特的控制流,异常是一个高层次的"goto",可以把它作为实现奇特的控制流的基础。如反向跟踪等。
异常的基础知识
python的try语句有两种风格---一种是处理异常(try/except/else),一种是无论是否发生异常都将执行最后的代码(try/finally)。
try/except/else风格
try : <语句> #运行别的代码 except <名字>: <语句> #如果在try部份引发了'name'异常 except <名字>,<数据>: <语句> #如果引发了'name'异常,获得附加的数据 else : <语句> #如果没有异常发生 |
try的工作原理是,当开始一个try语句后,python就在当前程序的上下文中作标记,这样当异常出现时就可以回到这里,try子句先执行,接下来会发生什么依赖于执行时是否出现异常。
- 如果当try后的语句执行时发生异常,python就跳回到try并执行第一个匹配该异常的except子句,异常处理完毕,控制流就通过整个try语句(除非在处理异常时又引发新的异常)。
- 如果在try后的语句里发生了异常,却没有匹配的except子句,异常将被递交到上层的try,或者到程序的最上层(这样将结束程序,并打印缺省的出错信息)。
- 如果在try子句执行时没有发生异常,python将执行else语句后的语句(如果有else的话),然后控制流通过整个try语句。
try/finally风格
try : <语句> finally : <语句> #退出try时总会执行 raise |
python总会执行finally子句,无论try子句执行时是否发一异常。
- 如果没有发生异常,python运行try子句,然后是finally子句,然后继续。
- 如果在try子句发生了异常,python就会回来执行finally子句,然后把异常递交给上层try,控制流不会通过整个try语句。
当你想无论是否发生异常都确保执行某些代码时,try/finally是有用的。
raise
要引发异常,你需要写raise语句,它的形式很简单,raise后面跟着要引发的异常。
raise <name> #手工地引发异常 raise <name>,<data> #传递一个附加的数据 |
什么是异常名(name)呢?它也许是内置作用域内的内置异常(如IndexError),或者是你程序中的任意字符串对象。
缺省行为:显示错误信息。
$ python test.py Traceback (innermost last): File "test.py" , line 3 , in ? a = 1 / 0 ZeroDivisionError: integer division or modulo |
当一个未捕获的异常发生时,python将结束程序并打印一个堆栈跟踪信息,以及异常名和附加信息。
用try捕获内置异常
如果你不想在异常发生时结束你的程序,只需在try里捕获它。
#!/usr/bin/python try : a = 1 / 0 print a except : print 'i get the error' |
当程序运行是会捕获一个错误并执行except后面的代码。
异常的惯用法
异常并不总是坏事情,例如,文件对象的read方法在文件尾时返回一个空串,python也提供一个内置函数raw_input,它从标准输入流读入。与read方法不同,当遇到文件尾时,raw_input()引发内置的EOFError错误。所以可以这样用:
while 1 : try : line = raw_input () #从stdin读入行 except EOFError: break #在文件末尾退出循环 esle: # 其它处理代码 |
用异常传递成功的信号
Found = 'item found' def search(): 引发或返回Found try : search() except Found: successful else : fail |
可以使用try来调试代码,你可以用自已的异常处理替换python缺省的异常处理。把整个程序封装在一个外部try里面,你可以捕获运行时的任何异常。
异常捕获模式
try 语句子句形式表 except : 捕获所有异常 except name: 只捕获特定的异常 except name,value: 捕获异常和它的附加数据 except (name1,name2): 捕获任何列出的异常 else : 如果没有异常 finally : 总是执行 |
捕获多个异常中的一个,python从上到下地查看except子句,括号里列出多个异常与列出单独的异常是一样的,只是更简洁一些。
运行时嵌套的异常,python会匹配最近的except。
finally子句无论如何都会执行,所以它是做清除动作的好地方,如关闭一个文件的操作。
捕捉所有异常
try : # 你的代码 except BaseException, e: print ( str (e)) |
python学习笔记——异常的更多相关文章
- Python学习笔记异常
在程序代码中,可能会有各种错误的情况出现,且产生错误的结果是后面的代码都无法执行,即使是一点无关紧要的错误,如图: 在这样的情况下,我们需要异常处理,对程序代码中的错误抛出异常信息,且不影响后面的代码 ...
- 【python学习笔记】8.异常
[python学习笔记]8.异常 raise Exception: 抛出指定异常 try/except: 捕捉异常 except: 第一个参数是需要捕获的异常类型,可以是多个类型组成元组,第二个参数是 ...
- python学习笔记5_异常
python学习笔记5_异常 1.什么事异常 Python使用异常对象(exception object) 来表示异常情况.遇到错误会发生异常. 如果异常对象未被处理或被捕捉,程序就会用所谓的回溯(t ...
- python学习笔记(六)文件夹遍历,异常处理
python学习笔记(六) 文件夹遍历 1.递归遍历 import os allfile = [] def dirList(path): filelist = os.listdir(path) for ...
- 【Python学习笔记之二】浅谈Python的yield用法
在上篇[Python学习笔记之一]Python关键字及其总结中我提到了yield,本篇文章我将会重点说明yield的用法 在介绍yield前有必要先说明下Python中的迭代器(iterator)和生 ...
- 雨痕 的《Python学习笔记》--附脑图(转)
原文:http://www.pythoner.com/148.html 近日,在某微博上看到有人推荐了 雨痕 的<Python学习笔记>,从github上下载下来看了下,确实很不错. 注意 ...
- 【目录】Python学习笔记
目录:Python学习笔记 目标:坚持每天学习,每周一篇博文 1. Python学习笔记 - day1 - 概述及安装 2.Python学习笔记 - day2 - PyCharm的基本使用 3.Pyt ...
- Python学习笔记之生成器、迭代器和装饰器
这篇文章主要介绍 Python 中几个常用的高级特性,用好这几个特性可以让自己的代码更加 Pythonnic 哦 1.生成器 什么是生成器呢?简单来说,在 Python 中一边循环一边计算的机制称为 ...
- Python学习笔记之文件处理
1.打开和关闭 要打开文件可以使用函数 open(),它位于自动导入模块 io 中.函数将文件名作为唯一不可缺少的函数,并返回一个文件对象.它还有一个名叫 mode 的参数,用于指定文件模式,其可取值 ...
随机推荐
- Linux-HAproxy+Keepalived
HAproxy+++++++++++++Info+++++++++++VIP:192.168.1.222HA-Master IP:192.168.1.117HA-Backup IP:192.168.1 ...
- Linux- Bond
---------------check NIC----------------- ①mii-tool 命令 ②ethtool 命令 -i 参数,显示网卡的驱动信息, -S 参数,底层工作状态信息③d ...
- linux下安装svn
linux下SVN服务器如何搭建和使用 | 浏览:12117 | 更新:2013-09-18 14:28 | 标签:linux linux下SVN服务器如何搭建和使用?说到SVN服务器,想必大家都知道 ...
- MS CRM 2011的自定义和开发(11)——插件(plugin)开发(一)
http://www.cnblogs.com/StoneGarden/archive/2012/02/02/2336147.html MS CRM 2011的自定义和开发(11)——插件(plugin ...
- js禁止从浏览器缓存读取消息
$.ajaxSetup ({ cache: false //设置成false将不会从浏览器缓存读取信息 });
- LintCode "Swap Two Nodes in Linked List"
Nothing special. Just take care of corner cases. class Solution { public: /** * @param head a ListNo ...
- 正则表达式(BREs,EREs,PREs)差异比较
我想各位也和我一样,再linux下使用grep,egrep, awk , sed, vi的搜索时,会经常搞不太清楚,哪此特殊字符得使用转义字符'\' .. 哪些不需要, grep与egrep的差异 ...
- 206. Reverse Linked List
反转链表 注意是借用 假的头节点,这样算法判断开始和结束,就好很多了. 借用头插法. []dummy/head [] [] [] [] head curr ==== class Solution ...
- iphone Dev 开发实例10:How To Add a Slide-out Sidebar Menu in Your Apps
Creating the Xcode Project With a basic idea about what we’ll build, let’s move on. You can create t ...
- 关于List泛型的强制转换
当我们从数据库中查询出一些数据,有时返回的结果可能是List<Object>类型,而我们清楚的知道它的准确类型是List<User>,可能我们想直接的去进行类型的转换,你可能会 ...