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字符串排序方法
Aug 29 Python
浅谈Python中数据解析
May 05 Python
Django中更新多个对象数据与删除对象的方法
Jul 17 Python
python开发之thread实现布朗运动的方法
Nov 11 Python
Python实现MySQL操作的方法小结【安装,连接,增删改查等】
Jul 12 Python
Python单元测试简单示例
Jul 03 Python
python实现关闭第三方窗口的方法
Jun 28 Python
win10下opencv-python特定版本手动安装与pip自动安装教程
Mar 05 Python
使用tensorflow进行音乐类型的分类
Aug 14 Python
python/golang实现循环链表的示例代码
Sep 14 Python
Python基础进阶之海量表情包多线程爬虫功能的实现
Dec 17 Python
python爬虫selenium模块详解
Mar 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防注入,表单提交值转义的实现详解
2013/06/10 PHP
php自动加载autoload机制示例分享
2014/02/20 PHP
微信营销平台系统?刮刮乐的开发
2014/06/10 PHP
js树形控件脚本代码
2008/07/24 Javascript
jQuery插件的写法分享
2013/06/12 Javascript
浅谈javascript回调函数
2014/12/07 Javascript
IE浏览器下PNG相关功能
2015/07/05 Javascript
JS判断浏览器是否安装flash插件的简单方法
2016/09/13 Javascript
jQuery实现手机版页面翻页效果的简单实例
2016/10/05 Javascript
Bootstrap源码解读导航(6)
2016/12/23 Javascript
vue.js将unix时间戳转换为自定义时间格式
2017/01/03 Javascript
浅谈js for循环输出i为同一值的问题
2017/03/01 Javascript
分享十三个最佳JavaScript数据网格库
2017/04/07 Javascript
AngularJS自定义指令实现面包屑功能完整实例
2017/05/17 Javascript
详谈javascript精度问题与调整
2017/07/08 Javascript
JS验证码实现代码
2017/09/14 Javascript
Vue from-validate 表单验证的示例代码
2017/09/26 Javascript
完美解决mui框架off-canvas侧滑超出部分隐藏无法滚动的问题
2018/01/25 Javascript
使用Vue父子组件通信实现todolist的功能示例代码
2019/04/11 Javascript
详解JS实现系统登录页的登录和验证
2019/04/29 Javascript
微信小程序select下拉框实现源码
2019/11/08 Javascript
[01:05:32]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#1COL VS Alliance第一局
2016/03/04 DOTA
Python脚本文件打包成可执行文件的方法
2015/06/02 Python
实例讲解Python设计模式编程之工厂方法模式的使用
2016/03/02 Python
Python中的 sort 和 sorted的用法与区别
2019/08/10 Python
python实现从尾到头打印单链表操作示例
2020/02/22 Python
python 数据分析实现长宽格式的转换
2020/05/18 Python
python读取hdfs上的parquet文件方式
2020/06/06 Python
python如何安装下载后的模块
2020/07/03 Python
scrapy利用selenium爬取豆瓣阅读的全步骤
2020/09/20 Python
一款纯css3实现的tab选项卡的实列教程
2014/12/11 HTML / CSS
Sunglasses Shop荷兰站:英国最大的太阳镜独立在线零售商和供应商
2017/01/08 全球购物
公司部门司机岗位职责
2014/01/03 职场文书
会议邀请函范文
2014/01/09 职场文书
2014年大学班长工作总结
2014/11/14 职场文书
游戏《铁拳》动画化!2022年年内播出
2022/03/21 日漫