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的print用法示例
Feb 11 Python
Python ORM框架SQLAlchemy学习笔记之映射类使用实例和Session会话介绍
Jun 10 Python
python分析nignx访问日志脚本分享
Feb 26 Python
python自定义类并使用的方法
May 07 Python
详解Python中的日志模块logging
Jun 19 Python
栈和队列数据结构的基本概念及其相关的Python实现
Aug 24 Python
正确理解python中的关键字“with”与上下文管理器
Apr 21 Python
Python turtle绘画象棋棋盘
Aug 21 Python
详解python tkinter模块安装过程
Jan 06 Python
深入浅析python 中的self和cls的区别
Jun 20 Python
Python实现对word文档添加密码去除密码的示例代码
Dec 29 Python
Python中使用Opencv开发停车位计数器功能
Apr 04 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
PHP 日期加减的类,很不错
2009/10/10 PHP
yii2利用自带UploadedFile实现上传图片的示例
2017/02/16 PHP
JavaScript toFixed() 方法
2010/04/15 Javascript
js 数组的for循环到底应该怎么写?
2010/05/31 Javascript
JS数学函数Exp使用说明
2012/08/09 Javascript
使用正则表达式的格式化与高亮显示json字符串
2014/12/03 Javascript
js实现iPhone界面风格的单选框和复选框按钮实例
2015/08/18 Javascript
谈一谈javascript闭包
2016/01/28 Javascript
webpack中引用jquery的简单实现
2016/06/08 Javascript
JS控制文本域只读或可写属性的方法
2016/06/24 Javascript
简单封装js的dom查询实例代码
2016/07/08 Javascript
将angular.js项目整合到.net mvc中的方法详解
2017/06/29 Javascript
Angular.js实现获取验证码倒计时60秒按钮的简单方法
2017/10/18 Javascript
Vue 菜单栏点击切换单个class(高亮)的方法
2018/08/22 Javascript
JavaScript实现新年倒计时效果
2018/11/17 Javascript
JS apply用法总结和使用场景实例分析
2020/03/14 Javascript
微信小程序实现上传多张图片、删除图片
2020/07/29 Javascript
vuejs element table 表格添加行,修改,单独删除行,批量删除行操作
2020/07/18 Javascript
Openlayers学习之加载鹰眼控件
2020/09/28 Javascript
[01:00:26]Ti4主赛事胜者组第一天 EG vs NEWBEE 1
2014/07/19 DOTA
Python基于sftp及rsa密匙实现远程拷贝文件的方法
2016/09/21 Python
Python实现将不规范的英文名字首字母大写
2016/11/15 Python
Django自定义分页效果
2017/06/27 Python
python基于物品协同过滤算法实现代码
2018/05/31 Python
详解Appium+Python之生成html测试报告
2019/01/04 Python
对PyQt5中树结构的实现方法详解
2019/06/17 Python
安装完Python包然后找不到模块的解决步骤
2020/02/13 Python
Python 跨.py文件调用自定义函数说明
2020/06/01 Python
Keras自定义实现带masking的meanpooling层方式
2020/06/16 Python
施华洛世奇加拿大官网:SWAROVSKI加拿大
2018/06/03 全球购物
伦敦剧院及景点门票:Encore Tickets
2018/07/01 全球购物
四年级数学教学反思
2014/02/02 职场文书
社区工作者演讲稿
2014/05/23 职场文书
退休教师追悼词
2015/06/23 职场文书
学困生帮扶工作总结
2015/08/13 职场文书
Nginx配置80端口访问8080及项目名地址方法解析
2021/03/31 Servers