Python编程中的异常处理教程


Posted in Python onAugust 21, 2015

1、异常简介
从软件方面来说,错误是语法或是逻辑上的,当python检测到一个错误时,解释器就会指出当前流已经无法继续执行下去,这时候就出现了异常。异常分为两个阶段:首先是引起异常发生的错误,然后是检测和采取可能的措施。常见异常有
NameError、ZeroDivisionError、SyntaxError、IndexError、KeyError、IOError、AttributeError、ValueError、
TypeError等。所有的标准/内建异常都是从根异常派生的,目前,有3个直接从BaseException派生的异常子类:SystemExit,KeyboardInterrupt和Exception。其它的所有的内建异常都是Exception的子类。
2、异常检测及处理
异常可以通过try语句来检测,有两种主要形式:try-except和try-finally。前者可以添加一个可选的else子句来处理没有检测到异常的情况。一个try语句可以对应一个或多个except语句,但只能对应一个finally子句,except用来捕获并处理异常,可以处理多个异常,也可以指定可选的异常参数(将会是一个包含来自异常的代码的诊断信息的类实例,异常参数自身会组成一个元组,并存储为类实例的属性),要避免裸except(会捕获所有异常,没有机会保存异常发生的原因,虽然可以通过sys.exc_info()获得,但不推荐,如果想捕获所有异常,可以在except中使用BaseException类,而Exception类不包括KeyboardInterrupt和SystemExit),finally无论发生错误与否都会执行。try-except-finally是个复合语句。try检测到异常时,try语句块中的剩余代码是不会执行的,异常会延着堆栈向上提交,直到找到合适的异常处理器,如果到达最顶层仍然没有找到对应的处理器,python解释器会显示出跟踪返回消息,然后退出。
try-except语法如下:

try: 
  try_suite 
except Exception1[, reason1]: 
  suite_for_exception_ Exception1 
except Exception2[, reason2]: 
  suite_for_exception_ Exception2 
except (Exception3, Exception4)[, reason3_4]: 
  suite_for_exceptions_ Exception3_and_Exception4 
except (Exc5[, Exc6[, ... ExcN]])[, reason]: 
  suite_for_exceptions_ Exc5_to_ExcN 
else: 
  suite_for_no_exception 
finally: 
  suite_always_run

 可同时捕捉多个异常,可捕捉异常对象,可忽略异常类型以捕捉所有异常

>>> try: 
  x = int(input('input x:')) 
  y = int(input('input y:')) 
  print('x/y = ',x/y) 
except ZeroDivisionError: #捕捉除0异常 
  print("ZeroDivision") 
except (TypeError,ValueError) as e: #捕捉多个异常,并将异常对象输出 
  print(e) 
except: #捕捉其余类型异常 
  print("it's still wrong") 
 
   
input x:12 
input y:0 
ZeroDivision 
>>> try: 
  x = int(input('input x:')) 
  y = int(input('input y:')) 
  print('x/y = ',x/y) 
except ZeroDivisionError: #捕捉除0异常 
  print("ZeroDivision") 
except (TypeError,ValueError) as e: #捕捉多个异常,并将异常对象输出 
  print(e) 
except: #捕捉其余类型异常 
  print("it's still wrong") 
 
   
input x:12 
input y:y 
invalid literal for int() with base 10: 'y'

try/except 可以加上 else 语句,实现在没有异常时执行什么

>>> try: 
  x = int(input('input x:')) 
  y = int(input('input y:')) 
  print('x/y = ',x/y) 
except ZeroDivisionError: #捕捉除0异常 
  print("ZeroDivision") 
except (TypeError,ValueError) as e: #捕捉多个异常 
  print(e) 
except: #捕捉其余类型异常 
  print("it's still wrong") 
else: #没有异常时执行 
  print('it work well') 
 
   
input x:12 
input y:3 
x/y = 4.0 
it work well

3、上下文管理中的with语句
如上提到的try-except和try-finally,python对隐藏细节做了大量的工作,因此需要你操心的仅是如何解决你所遇到的问题。另一个隐藏低层次的抽象的例子是with语句,它在python2.6中正式启用。python2.5尝试性的引入了with,并对使用with作为标识符的应用程序发出这样的警告——在python2.6中,with将会成为关键字。如果你想在python2.5使用wiht语句,你必须用from __fututure__ import with_statement来导入它。
类似try-except-finally,with语句也是用来简化代码的,这与用try-except和try-finally所想达到的目的千呼后应。try-except和try-finally的一种特定的配合用法是保证共享的资源的唯一分配,并在任务结束的时候释放它。比如文件(数据、日志、数据库等等),线程资源,简单同步,数据库连接等等,with语句的目的就是应用在这种场景。然而,with语句的目的在于从流程图中把try,except和finally关键字和资源分配释放相关代码统统去掉,而不是像try-except-finally那样仅仅简化代码使之易用。with语法的基本用法如下:

with context_expr [as var]: 
  with_suite

看起来如此简单,但with仅能工作于支持上下文管理协议的对象。当with语句执行时,便执行context_expr来获得一个上下文管理器,其职责是提供一个上下文对象,这是通过调用__context__()方法来实现的。一旦我们获得了上下文对象,就会调用它的__enter__()方法。当with语句块执行结束,会调用上下文对象的__exit__()方法,有三个参数,如果with语句块正常结束,三个参数都是None,如果发生异常,三个参数的值分别等于调用sys.exc_info()函数返回的三个值:类型(异常类),值(异常实例)和回溯(traceback)相应的回溯对象。contextlib模块可以帮助编写对象的上下文管理器。

常见异常:
Exception                        所有异常的基类
AttributeError                 特性应用或赋值失败时引发
IOError                             试图打开不存在的文件时引发
IndexError                       在使用序列中不存在的索引时引发
KeyError                          在使用映射不存在的键时引发
NameError                       在找不到名字(变量)时引发
SyntaxError                     在代码为错误形式时引发
TypeError                         在内建操作或者函数应用于错误类型的对象是引发
ValueError                       在内建操作或者函数应用于正确类型的对象,但是该对象使用不合适的值时引发
ZeroDivisionError          在除法或者摸除操作的第二个参数为0时引发

4.自定义异常:
继承于 Exception 的类

class myException(Exception):pass
5.抛出异常:
raise 语句
>>> def division(x,y): 
  if y == 0 : 
    raise ZeroDivisionError('The zero is not allow') 
  return x/y 
 
>>> try: 
  division(1,0) 
except ZeroDivisionError as e: 
  print(e) 
 
   
The zero is not allow
6.finally 语句
不管是否出现异常,最后都会执行finally的语句块内容,用于清理工作
所以,你可以在 finally 语句中关闭文件,这样就确保了文件能正常关闭
>>> try: 
  x = int(input('input x:')) 
  y = int(input('input y:')) 
  print('x/y = ',x/y) 
except ZeroDivisionError: #捕捉除0异常 
  print("ZeroDivision") 
except (TypeError,ValueError) as e: #捕捉多个异常 
  print(e) 
except: #捕捉其余类型异常 
  print("it's still wrong") 
else: #没有异常时执行 
  print('it work well') 
finally: #不管是否有异常都会执行 
  print("Cleaning up") 
 
   
input x:12 
input y:3 
x/y = 4.0 
it work well 
Cleaning up

异常抛出之后,如果没有被接收,那么程序会抛给它的上一层,比如函数调用的地方,要是还是没有接收,那继续抛出,如果程序最后都没有处理这个异常,那它就丢给操作系统了 -- 你的程序崩溃了,这点和C++一样的。

 

Python 相关文章推荐
浅谈python中截取字符函数strip,lstrip,rstrip
Jul 17 Python
Python中操作符重载用法分析
Apr 29 Python
Python爬虫框架Scrapy实例代码
Mar 04 Python
Python查找两个有序列表中位数的方法【基于归并算法】
Apr 20 Python
python3中的md5加密实例
May 29 Python
django 将model转换为字典的方法示例
Oct 16 Python
通过pykafka接收Kafka消息队列的方法
Dec 27 Python
实例详解Matlab 与 Python 的区别
Apr 26 Python
Pandas之Fillna填充缺失数据的方法
Jun 25 Python
Django使用消息提示简单的弹出个对话框实例
Nov 15 Python
pycharm通过anaconda安装pyqt5的教程
Mar 24 Python
Scrapy项目实战之爬取某社区用户详情
Sep 17 Python
剖析Python的Tornado框架中session支持的实现代码
Aug 21 #Python
约瑟夫问题的Python和C++求解方法
Aug 20 #Python
在类Unix系统上开始Python3编程入门
Aug 20 #Python
Python中字典映射类型的学习教程
Aug 20 #Python
Python3字符串学习教程
Aug 20 #Python
Python中列表和元组的相关语句和方法讲解
Aug 20 #Python
编写Python脚本抓取网络小说来制作自己的阅读器
Aug 20 #Python
You might like
ecshop 批量上传(加入自定义属性)
2012/03/20 PHP
php读取mysql中文数据出现乱码的解决方法
2013/08/16 PHP
Yii Framework框架获取分类下面的所有子类方法
2014/06/20 PHP
php获取数据库中数据的实现方法
2017/06/01 PHP
JavaScript对象模型-执行模型
2008/04/28 Javascript
JqGrid web打印实现代码
2011/05/31 Javascript
基于Jquery和CSS3制作数字时钟附源码下载(CSS3篇)
2015/11/24 Javascript
基于javascript实现泡泡大冒险网页版小游戏
2016/03/23 Javascript
json定义及jquery操作json的方法
2016/10/03 Javascript
Angular2学习笔记之数据绑定的示例代码
2018/01/03 Javascript
vue实现鼠标移入移出事件代码实例
2019/03/27 Javascript
nodejs和react实现即时通讯简易聊天室功能
2019/08/21 NodeJs
JS数组的高级使用方法示例小结
2020/03/14 Javascript
vue 根据选择的月份动态展示日期对应的星期几
2021/02/06 Vue.js
用Python实现换行符转换的脚本的教程
2015/04/16 Python
Python字符串详细介绍
2015/05/09 Python
Python中集合的内建函数和内建方法学习教程
2015/08/19 Python
Python设计模式之模板方法模式实例详解
2019/01/17 Python
Django DRF路由与扩展功能的实现
2020/06/03 Python
浅析HTML5:'data-'属性的作用
2018/01/23 HTML / CSS
三星美国官网:Samsung美国
2017/02/06 全球购物
台湾SHOPRO购物行家:亚洲首创影视.3C.家电.优质购物平台
2018/05/07 全球购物
军校制空专业毕业生自我鉴定
2013/11/16 职场文书
求职简历中自我评价
2014/01/28 职场文书
教师节商场活动方案
2014/02/13 职场文书
2015年前台文员工作总结
2015/05/18 职场文书
2016新年年会主持词
2015/07/06 职场文书
环保建议书作文500字
2015/09/14 职场文书
会议开幕致辞怎么写
2016/03/03 职场文书
导游词之介休绵山
2019/12/31 职场文书
Python 语言实现六大查找算法
2021/06/30 Python
Python编程中Python与GIL互斥锁关系作用分析
2021/09/15 Python
Mysql中有关Datetime和Timestamp的使用总结
2021/12/06 MySQL
正则表达式拆分url实例代码
2022/02/24 Java/Android
MySQL数据库实验实现简单数据库应用系统设计
2022/06/21 MySQL
MySQL的意向共享锁、意向排它锁和死锁
2022/07/15 MySQL