1. 抛出异常和自定义异常

Python用异常对象(exception object)表示异常情况,遇到错误后,会引发异常。如果异常对象并未被处理或捕捉,程序就会用所谓的回溯(Traceback,一种错误信息)终止执行。

1.1 raise 语句

Python中的raise 关键字用于引发一个异常,基本上和C#和Java中的throw关键字相同,如下所示:

 # -- coding: utf-8 --

 def ThorwErr():
raise Exception("抛出一个异常") # Exception: 抛出一个异常
ThorwErr()

raise关键字后面是抛出是一个通用的异常类型(Exception),一般来说抛出的异常越详细越好,Python在exceptions模块内建了很多的异常类型,通过使用dir函数来查看exceptions中的异常类型,如下:

import exceptions

# ['ArithmeticError', 'AssertionError'.....]
print dir(exceptions)

传递异常

捕捉到了异常,但是又想重新引发它(传递异常),可以使用不带参数的raise语句即可:

 # -- coding: utf-8 --
class MuffledCalculator:
muffled = False
def calc(self,expr):
try:
return eval(expr)
except ZeroDivisionError:
if self.muffled:
print 'Division by zero is illegal'
else:
raise

1.2 自定义异常类型

Python中也可以自定义自己的特殊类型的异常,只需要要从Exception类继承(直接或间接)即可:

class SomeCustomException(Exception):
pass

2. 捕捉异常

和C#中的try/catch类似,Python中使用try/except关键字来捕捉异常,如下:

# -- coding: utf-8 --

try:
print 2/0
except ZeroDivisionError:
print '除数不能为0'

2.1 捕捉多个异常

在一个except语句只捕捉其后声明的异常类型,如果可能会抛出的是其他类型的异常就需要再增加一个except语句了,或者也可以指定一个更通用的异常类型比如:Exception,如下:

# -- coding: utf-8 --
try:
print 2/''
except ZeroDivisionError:
print '除数不能为0'
except Exception:
print '其他类型异常'

为了捕获多个异常,除了声明多个except语句之外,还可以在一个except语句之后将多个异常作为元组列出来即可:

# -- coding: utf-8 --
try:
print 2/''
except (ZeroDivisionError,Exception):
print '发生了一个异常'

2.2获取异常信息

每个异常都会有一些异常信息,一般情况下我们应该把这些异常信息记录下来:

# -- coding: utf-8 --
try:
print 2/''
except (ZeroDivisionError,Exception) as e:
# unsupported operand type(s) for /: 'int' and 'str'
print e

3. finally子句

finally子句和try子句联合使用但是和except语句不同,finally不管try子句内部是否有异常发生,都会执行finally子句内的代码。所有一般情况下,finally自己常常用于关闭文件或者在Socket中。

# -- coding: utf-8 --
try:
print 2/''
except (ZeroDivisionError,Exception):
print '发生了一个异常'
finally:
print '不管是否发生异常都执行'

参考&进一步阅读

exceptions模块

Python基础教程(第二版)

【循序渐进学Python】9.异常处理的更多相关文章

  1. day9学python 类+异常处理+初识socket

    类+异常处理+初识socket 类的特点: 1.封装-同其他语言 2.继承 py2 经典类深度优先 新式类类名(object)广度优先py3 都是广度优先 3.多态-python本身无多态 可用方法调 ...

  2. 【循序渐进学Python】15.网络编程

    Python 内置封装了很多常见的网络协议的库,因此Python成为了一个强大的网络编程工具,这里是对Python的网络方面编程的一个简单描述. 1. 常用的网络设计模块 在标准库中有很多网络设计相关 ...

  3. 【循序渐进学Python】14.数据库的支持

    纯文本只能够实现一些简单有限的功能.如果想要实现自动序列化,也可以使用 shelve 模块和 pickle 模块来实现.但是,如果想要自动的实现数据并发访问,以及更标准,更通用的数据库(databas ...

  4. 【循序渐进学Python】13.基本的文件I/O

    文件I/O是Python中最重要的技术之一,在Python中对文件进行I/O操作是非常简单的. 1. 打开文件 使用 open 函数来打开文件,语法如下: open(name[, mode[, buf ...

  5. 【循序渐进学Python】12.Python 正则表达式简介

    正表达式就是一段匹配文本片段的模式,在Python 中 re 模块包含了对正则表达式(regular expression)的支持. 1. 正则表达式的基本概念 1. 通配符 点号( . )可以匹配换 ...

  6. 【循序渐进学Python】11.常用标准库

    安装完Python之后,我们也同时获得了强大的Python标准库,通过使用这些标准库可以为我们节省大量的时间.这里是一些常用标准库的简单说明.更多的标准库的说明,可以参考Python文档 sys 模块 ...

  7. 【循序渐进学Python】10.模块和包

    1.导入模块 任何Python程序都可以作为模块导入,只要Python解释器能找到我们定义的模块所在位置即可,一般来讲,在一个模块被导入时,Python解释器会按照下面的步骤进行搜索: 在当前所在目录 ...

  8. 【循序渐进学Python】8.面向对象的核心——类型(下)

    1 构造和初始化对象 __init__方法是Python内建众多魔法方法(什么是魔法方法?)中最常见的一个,通过这个方法我们可以定义一个对象的初始操作.当构造函数被调用的时候的任何参数都会传递给__i ...

  9. 【循序渐进学Python】7.面向对象的核心——类型(上)

    我们知道Python是一门面向对象的脚本语言.从C#的角度来看:首先Python支持多继承.Python 类型成员通常都是public的,并且所有成员函数都是virtual的(可以直接重写). 1. ...

随机推荐

  1. ECshop 怎样修改商品详细页的“浏览次数”

    怎样修改商品详细页的“浏览次数” 最好可以修改为成倍增加的,比如客户浏览了一次,显示的是20次. 修改 goods.php  文件的下面这行代码即可 $db->query('UPDATE ' . ...

  2. 关于创建可执行的jar文件(assembly)

    java利用maven生成一个jar包,如何自动生成清单属性文件(MANIFEST.MF),如何解决jar依赖问题? 办法很简单: 只需在pom.xml文件中配置如下plugin即可: <plu ...

  3. 用 Jenkins 打包 iOS

    需要安装插件: 1.GIT plugin 2.Xcode integration   1.新建 Job 填入“Item名称”,选择“构建一个自由风格的软件项目”,OK:   2.填入“项目名称”   ...

  4. Hibernate缓存原理与策略 Hibernate缓存原理:

    Hibernate缓存原理: 对于Hibernate这类ORM而言,缓存显的尤为重要,它是持久层性能提升的关键.简单来讲Hibernate就是对JDBC进行封装,以实现内部状态的管理,OR关系的映射等 ...

  5. 【原】Jqxgrid在Java服务器端分页

    研究这个后台分页一天多,特此写个文章记录备忘 jsp页面中有两个需要注意的地方:一个是source中beforeprocessing,另一个是rendergridrows中数据的获取. 说明:grid ...

  6. Xcode编译错误集锦

    1.在将ios项目进行Archive打包时,Xcode提示以下错误: [BEROR]CodeSign error: Certificate identity ‘iPhone Distribution: ...

  7. MMO之禅(三)职业能力

    MMO之禅(三)职业能力 --技术九层阶梯 Zephyr 201304 有了精神,我们还需要实际的行动. 到底需要什么能力?自我分析,窃以为为有九层,无所谓高低,因为每一层都需要不断地砥砺,编程,本身 ...

  8. c# socket 框架学习 SocketAsyncEventArgsPool 封装

    public class SocketAsyncEventArgsPool{ //已使用记录 private List<Int32> usedRecord; //未使用记录 private ...

  9. php ioc and web rest design

    三个核心文件 1.公开访问web service配置 config.php 2.管理BEAN,扫描,注册,初始化等流程 ioc.php 3.管理 rest 拦载处理 ws.php config.php ...

  10. DSP中CMD文件

    DSP中CMD文件 (2012-12-26 20:54:17) 转载▼ 标签: 杂谈 分类: DSP FPGA DSP的存储器的地址范围,CMD是主要是根据那个来编的.CMD 它是用来分配rom和ra ...