Python

异常:程序出现了错误而在正常控制流以外采取的行为

Python中常见的异常:

1. NameError:尝试访问一个未声明的变量

>>> something
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'something' is not defined

2. SyntaxError:解释器语法错误,是唯一不在运行时发生的异常

>>> for
File "<stdin>", line 1
for
^
SyntaxError: invalid syntax

3. IndexError:超出范围的值索引序列

>>> lst = []
>>> lst[1]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
try-except

定义了进行异常监控的一段代码,并提供了处理异常的机制

try:

try_suite #监控异常

except Exception[,reason]:

except_suite #异常处理代码

>>> try:
... f = open('somefile','r')
... except IOError,e:
... print 'could not open file:',e
...
could not open file: [Errno 2] No such file or directory: 'somefile'
>>>

上例中,只捕获了IOError异常,任何其它异常不会被捕获。

可以检测多种异常:

try:

try_suite #监控这里的异常

except Exception1[,reason1]:

except_suite1 #异常处理代码

except Exception2[,reason2]:

except_suite2 #异常处理代码

>>> def safe_float(obj):
... try:
... retval = float(obj)
... except ValueError:
... retval = 'could not convert non-number to float'
... except TypeError:
... retval = 'object type cannot be converted to float'
... return retval
...
>>> safe_float('xy.z')
'could not convert non-number to float'
>>> safe_float([1,2])
'object type cannot be converted to float'
>>>

一个except语句可以检测多种异常,多个异常要放在一个元组中:

try:

try_suite #监控这里的异常

except (Exception1 [,Exception2 [, …ExceptionN]]) [,reason]:

except_suite #异常处理代码

>>> def safe_float(obj):
... try:
... retval = float(obj)
... except (ValueError,TypeError):
... retval = 'could not convert to float'
... return retval
...
>>> safe_float('xy.z')
'could not convert to float'
>>> safe_float([1,2])
'could not convert to float'

一个except语句可以检测多种异常,多个异常要放在一个元组中:

try:

try_suite #监控这里的异常

except Exception,e:

except_suite #异常处理代码

Exception是大部分异常类的基类,因此上述代码支持捕获大多异常。KeyboardInterrupt(用户中断执行Ctrl+C)和SystemExit(python解释器请求退出)不是由于代码错误条件引起的异常,如下为异常类的树:

-BaseException

|- KeyboardInterrupt

|- SystemExit

|- Exception

|-所有内建异常

try-except的作用是提供一个可以提示错误或处理错误的机制,而不是一个错误过滤器,下面这种捕获所有异常并忽略错误不是一种合理的编程方式:

try:

except: Exception:

pass

避免把大片代码装入try-except中然后使用pass忽略掉错误。

可以捕获特定的异常并忽略它们,或是捕获所有的异常并采取特定的动作。

 
v异常参数:

异常也可以有参数,标准内建异常提供至少一个参数,指示异常原因的一个字符串

异常参数自身会组成一个元组,并存储为异常类的实例。

对于大多数内建异常,也就是从StandardError派生的异常,这个元组中只包含一个指示错误原因的字符串。操作系统或其他环境类型的错误,例如:IOError,元组中会把操作系统的错误编号放到错误字符串的前面

>>> try:
... float('xyz')
... except Exception,e:
... pass
...
>>> e
ValueError('could not convert string to float: xyz',)
>>> type(e)
<type 'exceptions.ValueError'>
>>> isinstance(e, ValueError)
True
>>> isinstance(e, Exception)
True
vtry-finally

try:

try-suite

finally:

finally-suite #无论如何都执行

finally子句是无论异常是否发生,是否捕获都会执行的一段代码

当在try范围中产生一个异常时,会立即跳转到finally语句段,当finally中的所有代码都执行完毕后,会继续向上一层引发异常。

如果finally中的代码引发了另一个异常或由于return、break、continue语法而终止,原来的异常将丢失而且无法重新引发。

try-except-else-finally

在try语句块中所有代码都执行成功后,将会执行else子句。

try:

try_suite

except Exception1:

suite_for_exception1

except (Exception2,Exception3,Exception4):

suite_for_exception2_and_3_and_4

except (Exception6, Exception7), Argument67:

suite_for_Exception6_and_7_plus_argument

except:

suite_for_all_other_exceptions

finally:

always_execute_suite

无论你选择哪一种语法,至少要有一个except子句

try语句块中异常发生点后的剩余语句将被忽略,不会被执行,解释器将搜索处理器,一旦找到,就开始执行处理器中的代码。如果没有找到合适的处理器,那么异常就向上移交给调用者去处理,如果上层调用者也没有找到合适的处理器,则该异常会继续被向上移交,直到找到合适的处理器,如果到达最顶层仍然没有找到对应处理器,那么就认为该异常未处理,解释器会显示出跟踪记录,然后退出。

之前看到的异常都是由解释器触发的。程序员也可以在遇到错误时主动触发异常:

raise [SomeException, [args [, traceback]]]

SomeException:可以是异常类或实例,如果是一个实例,则不能再带args参数

args: 异常参数

traceback: 跟踪记录对象

>>> class MyException(Exception):
... def __init__(self, length, atleast):
... Exception.__init__(self)
... self.length = length
... self.atleast = atleast
... def __str__(self):
... return 'MyException occered, length:%s, atleast:%s'%(self.length,self.atleast)
...
>>> try:
... raise MyException(2,3)
... except MyException,e:
... print e
...
MyException occered, length:2, atleast:3

sys模块中的exc_info()函数,是另一种获取异常信息的途径,它提供了一个三元祖信息,比我们单纯用异常参数获取的信息多

>>> exc_tuple
(<type 'exceptions.ValueError'>, ValueError('could not convert string to float: xy.z',), <traceback object at
0x01C0DF08>)

从sys.exc_info()得到的元组为:

exc_type: 异常类

exc_value:异常类的实例

exc_traceback: 跟踪记录对象

断言是一句等价于布尔真的判定,如果表达式为假,触发AssertionError异常

assert expression[, arguments]

>>> assert 1==1
>>> assert 1==0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError
>>> assert 1==0, 'one does not equal zero'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError: one does not equal zero

用try-except可以捕获AssertionError异常:

>>> try:
... assert 1==0 , 'one does not equal zero'
... except AssertionError,e:
... print '%s:%s'%(e.__class__.__name__,e)
...
AssertionError:one does not equal zero
>>>

Python基础(10) - 异常的更多相关文章

  1. 『Python基础-10』字典

    # 『Python基础-10』字典 目录: 1.字典基本概念 2.字典键(key)的特性 3.字典的创建 4-7.字典的增删改查 8.遍历字典 1. 字典的基本概念 字典一种key - value 的 ...

  2. 十九. Python基础(19)--异常

    十九. Python基础(19)--异常 1 ● 捕获异常 if VS异常处理: if是预防异常出现, 异常处理是处理异常出现 异常处理一般格式: try:     <............. ...

  3. 十. Python基础(10)--装饰器

    十. Python基础(10)--装饰器 1 ● 装饰器 A decorator is a function that take a function as an argument and retur ...

  4. Python基础之异常定义

    技术背景 在各类python的项目中,总会涉及到项目自身相关的一些约束条件.这些约束条件体现在,当用户输入的参数或者文件不符合项目要求时,就拒绝这个参数的输入并且播报出来,提醒用户自行修改,而这一过程 ...

  5. [Python基础]008.异常

    异常 异常处理 捕获异常 抛出异常 自定义异常 一些常见的异常 异常处理 捕获异常 try/except 与C,java等语言用try/catch来捕获异常相似,Python使用try/except ...

  6. python基础(10)-匿名函数&内置函数

    匿名函数 例子 返回两个数的和 def add(x, y): return x + y # 等价于 add = lambda x, y: x + y 返回字典中值最大的key dic = {'a': ...

  7. python 基础 10.0 nosql 简介--redis 连接池及管道

    一. NOSQL 数据库简介 NoSQL 泛指非关系型的数据库.非关系型数据库与关系型数据库的差别 非关系型数据库的优势: 1.性能NOSQL 是基于键值对的,可以想象成表中的主键和值的对应关系,而且 ...

  8. 『无为则无心』Python基础 — 10、Python字符串的格式化输出

    目录 1.什么是格式化输出 2.Python格式化输出的五种方式 方式一:字符串之间用+号拼接 方式二:print()函数可同时输出多个字符串 方式三:占位符方式 方式四:f格式化方式(推荐) 方式五 ...

  9. Python基础10 反过头来看看

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 从最初的"Hello World",走到面向对象.该回过头来看 ...

随机推荐

  1. Markdown编辑器——常用语法

    Markdown是什么? 简短来说,他就是一款特别适用于写博客的编辑器.为什么适合呢,因为它特别的方便.以博客园的编辑界面来说,它原本的界面是这样的(有没有一种Word2003的既视感): 但是,当你 ...

  2. subprocess.Popen命令如何隐藏弹框

    在用PYQT编写GUI界面时,代码中有用到subprocess.Popen(),打包exe后每次遇到subprocess语句是就会弹出命令框,很是头疼, 下面是解决的办法 import subproc ...

  3. 基于 Raphael 的 Web UI 设计 - 初稿

    基于 Raphael 的 UI 设计 - 初稿 还有很多地方需要完善,这次要把 Raphael 彻底用起来,^_^, 一定要150字哦,一图抵千字啊,^_^,不喜欢写字的,那么怎么凑够150字呢,说说 ...

  4. SQL Server数据库的基础脚本编程

    数据库脚本的基础编程 Go批量处理语句 用于同时处理多条语句 use指定数据库或表 use master --创建数据库 go use Student --创建表(Student)表示数据库 go 创 ...

  5. Jenkins+.Net Core+Git集成发布 - SkyMallCore快速开发平台

    准备工作:安装 Jenkins+java 直接百度安装,在此忽略 dotnet sdk(iis部署已经安装) 一:windows 部署到IIS 首先搭建IIS,站点应用程序池选择 ‘无托管代码’ 安装 ...

  6. Sql语法高级应用之二:视图

    SQL CREATE VIEW 语句 什么是视图? 在 SQL 中,视图是基于 SQL 语句的结果集的可视化的表. 视图包含行和列,就像一个真实的表.视图中的字段就是来自一个或多个数据库中的真实的表中 ...

  7. 【总结】 BZOJ1000~1099板刷计划

    Tham又布置了一大堆题目,但是因为我TCL完全不会做,所以只能切切BZOJ的题目,划划水,要不是xz的面子大,我就已经被赶出了CJ信息组了QwQ(聂已己是神仙!) 1000 A+B这种入门题就不用写 ...

  8. python--区分函数和方法, 反射

    1.  isinstance,   type,   issubclass isinstance(): 判断你给的xxx对象是否是xxxxx类型的,只支持向上判断 isinstance(object, ...

  9. linux环境搭建前期配置

    一.永久修改主机名 1.修改network文件 # vim /etc/sysconfig/network 加入 HOSTNAME=主机名 保存退出 2.修改hosts文件 # vim /etc/hos ...

  10. django_jquery中使用ajax发送post请求变成get请求

    今天在进行js开发的过程中出现了一个奇怪的问题,就是使用ajax向后端发送post请求时,在浏览器network中查看response时,显示400 bad request 并且请求方式变成get,因 ...