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 装饰器深入理解
Mar 16 Python
Python利用Beautiful Soup模块修改内容方法示例
Mar 27 Python
Python向日志输出中添加上下文信息
May 24 Python
Win7 64位下python3.6.5安装配置图文教程
Oct 27 Python
numpy.linspace 生成等差数组的方法
Jul 02 Python
Python实现的json文件读取及中文乱码显示问题解决方法
Aug 06 Python
利用Python实现原创工具的Logo与Help
Dec 03 Python
Python操作rabbitMQ的示例代码
Mar 19 Python
Python将文字转成语音并读出来的实例详解
Jul 15 Python
python中sort sorted reverse reversed函数的区别说明
May 11 Python
Python如何执行精确的浮点数运算
Jul 31 Python
Python爬虫入门案例之爬取二手房源数据
Oct 16 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 事件机制(2)
2011/03/23 PHP
php设计模式 Interpreter(解释器模式)
2011/06/26 PHP
PHP中new static() 和 new self() 的区别介绍
2015/01/09 PHP
Zend Framework入门教程之Zend_View组件用法示例
2016/12/09 PHP
通过Unicode转义序列来加密,按你说的可以算是混淆吧
2007/05/06 Javascript
符合W3C网页标准的iframe标签的使用方法
2007/07/19 Javascript
jquery+json 通用三级联动下拉列表
2010/04/19 Javascript
Js日期选择器并自动加入到输入框中示例代码
2013/08/02 Javascript
基于JavaScript实现瀑布流布局(二)
2016/01/26 Javascript
跨域资源共享 CORS 详解
2016/04/26 Javascript
javascript简单判断输入内容是否合法的方法
2016/05/11 Javascript
jQuery Validate让普通按钮触发表单验证的方法
2016/12/15 Javascript
vue移动端裁剪图片结合插件Cropper的使用实例代码
2017/07/10 Javascript
Angular5集成eventbus的示例代码
2018/07/19 Javascript
Vue全局loading及错误提示的思路与实现
2019/08/09 Javascript
IntelliJ IDEA编辑器配置vue高亮显示
2019/09/26 Javascript
Vue通过for循环随机生成不同的颜色或随机数的实例
2019/11/09 Javascript
vue组件传值的实现方式小结【三种方式】
2020/02/05 Javascript
小程序分享链接onShareAppMessage的具体用法
2020/05/22 Javascript
js实现车辆管理系统
2020/08/26 Javascript
vue离开当前页面触发的函数代码
2020/09/01 Javascript
在Python的Django框架中实现Hacker News的一些功能
2015/04/17 Python
简介Django中内置的一些中间件
2015/07/24 Python
实例讲解Python中global语句下全局变量的值的修改
2016/06/16 Python
Python中asyncio与aiohttp入门教程
2018/10/16 Python
python实现按关键字筛选日志文件
2019/12/24 Python
Django ORM判断查询结果是否为空,判断django中的orm为空实例
2020/07/09 Python
Python使用urlretrieve实现直接远程下载图片的示例代码
2020/08/17 Python
浅谈基于HTML5的在线视频播放方案
2016/02/18 HTML / CSS
受外贸欢迎的美国主机:BlueHost
2017/05/16 全球购物
JMS中Topic和Queue有什么区别
2013/05/15 面试题
介绍一下Ruby的特点
2013/01/20 面试题
冰淇淋开店创业计划书
2014/02/01 职场文书
六五普法规划实施方案
2014/03/21 职场文书
中职生自荐信范文
2014/06/15 职场文书
会计人员演讲稿
2014/09/11 职场文书