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 xlrd读取excel日期类型的2种方法
Apr 28 Python
Python调用命令行进度条的方法
May 05 Python
Python简单调用MySQL存储过程并获得返回值的方法
Jul 20 Python
Django接受前端数据的几种方法总结
Nov 04 Python
使用python为mysql实现restful接口
Jan 05 Python
python最小生成树kruskal与prim算法详解
Jan 17 Python
Django 自动生成api接口文档教程
Nov 19 Python
jupyter notebook 的工作空间设置操作
Apr 20 Python
python中round函数如何使用
Jun 19 Python
详解使用Python写一个向数据库填充数据的小工具(推荐)
Sep 11 Python
Python confluent kafka客户端配置kerberos认证流程详解
Oct 12 Python
Python命令行参数定义及需要注意的地方
Nov 30 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 htmlspecialchars加强版
2010/02/16 PHP
php下获取客户端ip地址的函数
2010/03/15 PHP
php基础学习之变量的使用
2011/06/09 PHP
php获取新浪微博数据API实例
2013/11/12 PHP
php Calender(日历)代码分享
2014/01/03 PHP
Yii中CGridView实现批量删除的方法
2015/12/28 PHP
PHP验证码类ValidateCode解析
2017/01/07 PHP
通过上下左右键和回车键切换光标实现代码
2013/03/08 Javascript
Microsfot .NET Framework4.0框架 安装失败的解决方法
2013/08/14 Javascript
各种页面定时跳转(倒计时跳转)代码总结
2013/10/24 Javascript
jQuery动画出现连续触发、滞后反复执行的解决方法
2015/01/28 Javascript
JS实现双击屏幕滚动效果代码
2015/10/28 Javascript
jQuery移动端图片上传组件
2016/06/12 Javascript
AngularJS通过$location获取及改变当前页面的URL
2016/09/23 Javascript
webpack打包单页面如何引用的js
2017/06/07 Javascript
vue2.0 循环遍历加载不同图片的方法
2018/03/06 Javascript
vue-cli与webpack处理静态资源的方法及webpack打包的坑
2018/05/15 Javascript
微信小程序仿知乎实现评论留言功能
2018/11/28 Javascript
React中使用外部样式的3种方式(小结)
2019/05/28 Javascript
python局部赋值的规则
2013/03/07 Python
解读! Python在人工智能中的作用
2017/11/14 Python
vue.js实现输入框输入值内容实时响应变化示例
2018/07/07 Python
使用Python发现隐藏的wifi
2020/03/04 Python
戴森美国官网:Dyson美国
2016/09/11 全球购物
美津浓美国官网:Mizuno美国
2018/08/07 全球购物
实习评语
2013/12/16 职场文书
村委会主任先进事迹
2014/01/15 职场文书
十佳护士获奖感言
2014/02/18 职场文书
投资意向书范本
2014/04/01 职场文书
教师产假请假条范文
2014/04/10 职场文书
债务追讨授权委托书范本
2014/10/16 职场文书
英语感谢信范文
2015/01/20 职场文书
2015年度班主任自我评价
2015/03/11 职场文书
2015年世界艾滋病日活动总结
2015/03/24 职场文书
中考百日冲刺决心书
2015/09/22 职场文书
php将xml转化对象的实例详解
2021/11/17 PHP