Python 错误和异常小结[转]

原文链接    http://blog.csdn.net/sinchb/article/details/8392827

     事先说明哦,这不是一篇关于Python异常的全面介绍的文章,这只是在学习Python异常后的一篇笔记式的记录和小结性质的文章。什么?你还不知道什么是异常,额...

1.Python异常类

    Python是面向对象语言,所以程序抛出的异常也是类。常见的Python异常有以下几个,大家只要大致扫一眼,有个映像,等到编程的时候,相信大家肯定会不只一次跟他们照面(除非你不用Python了)。

   

异常描述
NameError尝试访问一个没有申明的变量
ZeroDivisionError除数为0
SyntaxError语法错误
IndexError索引超出序列范围
KeyError请求一个不存在的字典关键字
IOError输入输出错误(比如你要读的文件不存在)
AttributeError尝试访问未知的对象属性
ValueError传给函数的参数类型不正确,比如给int()函数传入字符串形

 

2.捕获异常

    Python完整的捕获异常的语句有点像:

 

[html] view plaincopy
  1. try:  
  2.     try_suite  
  3. except Exception1,Exception2,...,Argument:  
  4.     exception_suite  
  5. ......   #other exception block  
  6. else:  
  7.     no_exceptions_detected_suite  
  8. finally:  
  9.     always_execute_suite  

    额...是不是很复杂?当然,当我们要捕获异常的时候,并不是必须要按照上面那种格式完全写下来,我们可以丢掉else语句,或者finally语句;甚至不要exception语句,而保留finally语句。额,晕了?好吧,下面,我们就来一一说明啦。

 

2.1.try...except...语句

    try_suite不消我说大家也知道,是我们需要进行捕获异常的代码。而except语句是关键,我们try捕获了代码段try_suite里的异常后,将交给except来处理。

    try...except语句最简单的形式如下:

[python] view plaincopy
  1. try:  
  2.     try_suite  
  3. except:  
  4.     exception block  

    上面except子句不跟任何异常和异常参数,所以无论try捕获了任何异常,都将交给except子句的exception block来处理。如果我们要处理特定的异常,比如说,我们只想处理除零异常,如果其他异常出现,就让其抛出不做处理,该怎么办呢?这个时候,我们就要给except子句传入异常参数啦!那个ExceptionN就是我们要给except子句的异常类(请参考异常类那个表格),表示如果捕获到这类异常,就交给这个except子句来处理。比如:

 

 

[python] view plaincopy
  1. try:  
  2.     try_suite  
  3. except Exception:  
  4.     exception block  

    举个例子:

 

 

[python] view plaincopy
  1. >>> try:  
  2. ...     res = 2/0  
  3. ... except ZeroDivisionError:  
  4. ...     print "Error:Divisor must not be zero!"  
  5. ...   
  6. Error:Divisor must not be zero!  

 

    看,我们真的捕获到了ZeroDivisionError异常!那如果我想捕获并处理多个异常怎么办呢?有两种办法,一种是给一个except子句传入多个异常类参数,另外一种是写多个except子句,每个子句都传入你想要处理的异常类参数。甚至,这两种用法可以混搭呢!下面我就来举个例子。

 

[python] view plaincopy
  1. try:  
  2.     floatnum = float(raw_input("Please input a float:"))  
  3.     intnum = int(floatnum)  
  4.     print 100/intnum  
  5. except ZeroDivisionError:  
  6.     print "Error:you must input a float num which is large or equal then 1!"  
  7. except ValueError:  
  8.     print "Error:you must input a float num!"  
  9.   
  10. [root@Cherish tmp]# python test.py   
  11. Please input a float:fjia  
  12. Error:you must input a float num!  
  13. [root@Cherish tmp]# python test.py   
  14. Please input a float:0.9999  
  15. Error:you must input a float num which is large or equal then 1!  
  16. [root@Cherish tmp]# python test.py   
  17. Please input a float:25.091  
  18. 4  

    上面的例子大家一看都懂,就不再解释了。只要大家明白,我们的except可以处理一种异常,多种异常,甚至所有异常就可以了。

 

    大家可能注意到了,我们还没解释except子句后面那个Argument是什么东西?别着急,听我一一道来。这个Argument其实是一个异常类的实例(别告诉我你不知到什么是实例),包含了来自异常代码的诊断信息。也就是说,如果你捕获了一个异常,你就可以通过这个异常类的实例来获取更多的关于这个异常的信息。例如:

 

[python] view plaincopy
  1. >>> try:  
  2. ...     1/0  
  3. ... except ZeroDivisionError,reason:  
  4. ...     pass  
  5. ...   
  6. >>> type(reason)  
  7. <type 'exceptions.ZeroDivisionError'>  
  8. >>> print reason  
  9. integer division or modulo by zero  
  10. >>> reason  
  11. ZeroDivisionError('integer division or modulo by zero',)  
  12. >>> reason.__class__  
  13. <type 'exceptions.ZeroDivisionError'>  
  14. >>> reason.__class__.__doc__  
  15. 'Second argument to a division or modulo operation was zero.'  
  16. >>> reason.__class__.__name__  
  17. 'ZeroDivisionError'  

    上面这个例子,我们捕获了除零异常,但是什么都没做。那个reason就是异常类ZeroDivisionError的实例,通过type就可以看出。

 

2.2try ... except...else语句

    现在我们来说说这个else语句。Python中有很多特殊的else用法,比如用于条件和循环。放到try语句中,其作用其实也差不多:就是当没有检测到异常的时候,则执行else语句。举个例子大家可能更明白些:

 

[python] view plaincopy
  1. >>> import syslog  
  2. >>> try:  
  3. ...     f = open("/root/test.py")  
  4. ... except IOError,e:  
  5. ...     syslog.syslog(syslog.LOG_ERR,"%s"%e)  
  6. ... else:  
  7. ...     syslog.syslog(syslog.LOG_INFO,"no exception caught\n")  
  8. ...   
  9. >>> f.close()  

 

2.3 finally子句

    finally子句是无论是否检测到异常,都会执行的一段代码。我们可以丢掉except子句和else子句,单独使用try...finally,也可以配合except等使用。

例如2.2的例子,如果出现其他异常,无法捕获,程序异常退出,那么文件 f 就没有被正常关闭。这不是我们所希望看到的结果,但是如果我们把f.close语句放到finally语句中,无论是否有异常,都会正常关闭这个文件,岂不是很 妙

 

[python] view plaincopy
  1. >>> import syslog  
  2. >>> try:  
  3. ...     f = open("/root/test.py")  
  4. ... except IOError,e:  
  5. ...     syslog.syslog(syslog.LOG_ERR,"%s"%e)  
  6. ... else:  
  7. ...     syslog.syslog(syslog.LOG_INFO,"no exception caught\n")  
  8. ... finally:   
  9. >>>     f.close()  

    大家看到了没,我们上面那个例子竟然用到了try,except,else,finally这四个子句!:-),是不是很有趣?到现在,你就基本上已经学会了如何在Python中捕获常规异常并处理之。

 

3.两个特殊的处理异常的简便方法

3.1断言(assert)

    什么是断言,先看语法:

 

[python] view plaincopy
  1. assert expression[,reason]  

 

    其中assert是断言的关键字。执行该语句的时候,先判断表达式expression,如果表达式为真,则什么都不做;如果表达式不为真,则抛出异常。reason跟我们之前谈到的异常类的实例一样。不懂?没关系,举例子!最实在!

 

[python] view plaincopy
  1. >>> assert len('love') == len('like')  
  2. >>> assert 1==1  
  3. >>> assert 1==2,"1 is not equal 2!"  
  4. Traceback (most recent call last):  
  5.   File "<stdin>", line 1, in <module>  
  6. AssertionError: is not equal 2!  

我们可以看到,如果assert后面的表达式为真,则什么都不做,如果不为真,就会抛出AssertionErro异常,而且我们传进去的字符串会作为异常类的实例的具体信息存在。其实,assert异常也可以被try块捕获:

 

 

[python] view plaincopy
  1. >>> try:  
  2. ...     assert 1 == 2 , "1 is not equal 2!"  
  3. ... except AssertionError,reason:  
  4. ...     print "%s:%s"%(reason.__class__.__name__,reason)  
  5. ...   
  6. AssertionError:is not equal 2!  
  7. >>> type(reason)  
  8. <type 'exceptions.AssertionError'>  

 

3.2.上下文管理(with语句)

   如果你使用try,except,finally代码仅仅是为了保证共享资源(如文件,数据)的唯一分配,并在任务结束后释放它,那么你就有福了!这个with语句可以让你从try,except,finally中解放出来!语法如下:

 

[python] view plaincopy
  1. with context_expr [as var]:  
  2.     with_suite  

    是不是不明白?很正常,举个例子来!

 

[python] view plaincopy
  1. >>> with open('/root/test.py') as f:  
  2. ...     for line in f:  
  3. ...         print line  

    上面这几行代码干了什么?

    (1)打开文件/root/test.py

    (2)将文件对象赋值给  f

    (3)将文件所有行输出

     (4)无论代码中是否出现异常,Python都会为我们关闭这个文件,我们不需要关心这些细节。

    这下,是不是明白了,使用with语句来使用这些共享资源,我们不用担心会因为某种原因而没有释放他。但并不是所有的对象都可以使用with语句,只有支持上下文管理协议(context management protocol)的对象才可以,那哪些对象支持该协议呢?如下表:

file 

decimal.Context

thread.LockType

threading.Lock

threading.RLock

threading.Condition

threading.Semaphore

threading.BoundedSemaphore

    至于什么是上下文管理协议,如果你不只关心怎么用with,以及哪些对象可以使用with,那么我们就不比太关心这个问题:)

4.抛出异常(raise)

    如果我们想要在自己编写的程序中主动抛出异常,该怎么办呢?raise语句可以帮助我们达到目的。其基本语法如下:

 

[python] view plaincopy
  1. raise [SomeException [, args [,traceback]]  

    第一个参数,SomeException必须是一个异常类,或异常类的实例

 

    第二个参数是传递给SomeException的参数,必须是一个元组。这个参数用来传递关于这个异常的有用信息。

    第三个参数traceback很少用,主要是用来提供一个跟中记录对象(traceback)

    下面我们就来举几个例子。

 

[python] view plaincopy
  1. >>> raise NameError  
  2. Traceback (most recent call last):  
  3.   File "<stdin>", line 1, in <module>  
  4. NameError  
  5. >>> raise NameError()  #异常类的实例  
  6. Traceback (most recent call last):  
  7.   File "<stdin>", line 1, in <module>  
  8. NameError  
  9. >>> raise NameError,("There is a name error","in test.py")  
  10. Traceback (most recent call last):  
  11.   File "<stdin>", line 1, in <module>  
  12. >>> raise NameError("There is a name error","in test.py")  #注意跟上面一个例子的区别  
  13. Traceback (most recent call last):  
  14.   File "<stdin>", line 1, in <module>  
  15. NameError: ('There is a name error', 'in test.py')  
  16. >>> raise NameError,NameError("There is a name error","in test.py")  #注意跟上面一个例子的区别  
  17. Traceback (most recent call last):  
  18.   File "<stdin>", line 1, in <module>  
  19. NameError: ('There is a name error', 'in test.py')  

    其实,我们最常用的还是,只传入第一个参数用来指出异常类型,最多再传入一个元组,用来给出说明信息。如上面第三个例子。

 

5.异常和sys模块

    另一种获取异常信息的途径是通过sys模块中的exc_info()函数。该函数回返回一个三元组:(异常类,异常类的实例,跟中记录对象)

 

[python] view plaincopy
    1. >>> try:  
    2. ...     1/0  
    3. ... except:  
    4. ...     import sys  
    5. ...     tuple = sys.exc_info()  
    6. ...   
    7. >>> print tuple  
    8. (<type 'exceptions.ZeroDivisionError'>, ZeroDivisionError('integer division or modulo by zero',), <traceback object at 0x7f538a318b48>)  
    9. >>> for i in tuple:  
    10. ...     print i  
    11. ...   
    12. <type 'exceptions.ZeroDivisionError'> #异常类      
    13. integer division or modulo by zero #异常类的实例  
    14. <traceback object at 0x7f538a318b48> #跟踪记录对象  
欢迎加群互相学习,共同进步。QQ群:iOS: 58099570 | Android: 572064792 | Nodejs:329118122 做人要厚道,转载请注明出处!




















本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sunshine-anycall/p/4824395.html,如需转载请自行联系原作者

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/454443.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Django REST framework 认证、权限和频率组件

认证与权限频率组件 身份验证是将传入请求与一组标识凭据&#xff08;例如请求来自的用户或其签名的令牌&#xff09;相关联的机制。然后 权限 和 限制 组件决定是否拒绝这个请求。 简单来说就是&#xff1a; 认证确定了你是谁权限确定你能不能访问某个接口限制确定你访问某…

高速率AVS整数变换的汇编实现与优化

1 引言 AVS标准Ⅲ采用的8x8整数变换在获得较H&#xff0e;264更高的压缩率和主观图像质量的同时&#xff0c;增加了算法的实现复杂性和时间开销。本文重点研究AVS编解码器的整数变换模块&#xff0c;针对不同的算法实现模式&#xff0c;在原有Visual C6&#xff0e;0整数变换模…

计算机与广播电视论文,浅谈广播电视中计算机技术的作用论文.pdf

1、计算机技术在广播电视的媒体内容中有重要应用在以往的广播电视中&#xff0c; 媒体内容主要分为音频和视频两种信号&#xff0c; 在传输的过程中使用的是模拟信号&#xff0c; 但模拟信号受到的外界干扰因素较为明显&#xff0c; 因此广播电视传播的媒体内容受到影响&#x…

opencv安装教程python3.7_Mac下安装使用Python-OpenCV,解决opencv3安装完成无法使用的问题 - pytorch中文网...

OpenCV是一个跨平台计算机视觉库&#xff0c;可以运行在Linux、Windows、Android和Mac OS操作系统上。提供了Python、Ruby、MATLAB等语言的接口&#xff0c;实现了图像处理和计算机视觉方面的很多通用算法。 Mac安装OpenCV 在我们的深度学习的过程中&#xff0c;对于图像&#…

NodeJS在CentOs7下安装

node下载地址:https://nodejs.org/en/download/ 1.安装gcc $ yum install gcc-c 2.解压最新版本 $ mkdir /usr/local/node$ tar zxvf node-v6.11.4.tar.gz $ cd node-v6.11.4$ ./configure --prefix/usr/local/node# 在当前目录下编译安装Node$ make$ make install 3.验证安装 …

Python功能之反射

有如下文件: index.py 1<span style"font-family:宋体, SimSun;">#!/usr/bin/env python<br data-filtered"filtered"># -*- coding:utf-8 -*-<br data-filtered"filtered">__author__ ryan<br data-filtered"filter…

Django REST framework 分页

分页模式 rest framework中提供了三种分页模式&#xff1a; from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination 全局配置 REST_FRAMEWORK {DEFAULT_PAGINATION_CLASS: rest_framework.pagination.LimitOffsetPaginat…

解析H.264视频编解码DSP实现与优化

引言 基于互联网的数字视频产业前景看好&#xff0c;而3G的规模部署&#xff0c;也会推动移动视频通信成为现实。但数字化后的视频图像具有数据海量性&#xff0c;给图像的存储和传输造成较大的困难。数字视频产业&#xff0c;是指数字内容中以数字视频形态为主的文化创意和传播…

ap计算机科学a买什么书,准备AP*计算机科学A考试-第1部分

你将学到什么Identify the use and proper use of Variables, Conditionals, Objects and primitives, control structures, booleans, lists and arrays, and Exceptions.Implement problem descriptions in well designed code.Identify and begin to design algorithms to s…

python 打包exe_python如何封装为exe

1、首先进入python安装路径D:\Python27\Scripts下&#xff0c;查看pip或easy_install是否安装。2、确保安装了pip或者easy_install&#xff0c;在cmd命令行下输入“easy_install”&#xff0c;没有提示“xxx不是内部或外部命令……”&#xff0c;就说明easy install工具安装成功…

CentOS7安装Hadoop2.7完整步骤

总体思路&#xff0c;准备主从服务器&#xff0c;配置主服务器可以无密码SSH登录从服务器&#xff0c;解压安装JDK&#xff0c;解压安装Hadoop&#xff0c;配置hdfs、mapreduce等主从关系。 1、环境&#xff0c;3台CentOS7&#xff0c;64位&#xff0c;Hadoop2.7需要64位Linux&…

Django REST framework 解析器和渲染器

解析器的作用 解析器的作用就是服务端接收客户端传过来的数据&#xff0c;把数据解析成自己可以处理的数据。本质就是对请求体中的数据进行解析。 在了解解析器之前&#xff0c;我们要先知道Accept以及ContentType请求头。 Accept是告诉对方我能解析什么样的数据&#xff0c…

MyBatis的学习之路(二)

上篇文章介绍了MyBatis的配置文件&#xff0c;现在来介绍实体映射文件Mapper.xml。 说道实体映射文件&#xff0c;就不得不说一下实体与表之间的映射关系&#xff1a;单表映射和多表映射。 a. 单表映射 1 public class Admin{ 2 private String id; 3 private String n…

计算机一级实验素材题目,计算机一级EXCEL操作题整理素材(12页)-原创力文档...

素材摘录&#xff0c;文档可编辑分享PAGE 页码页码/NUMPAGES 总页数总页数单元格合并首先选中你要合并的单元格&#xff0c;然后找到EXCEL上的开始分区里的这种图标或者是含有“合并”两字的位置如图1-1&#xff0c;如果题目要求的是要你合并单元格并让内容居中&#xff0c;你就…

python爬取toefl_spark学习进度6-Python爬取数据的四个简单实例

今天本来想把昨天安装的intellij配置好&#xff0c;但是一直显示没有网络&#xff0c;网上查了相关资料也没有查出来解决办法。然后暂停了intellij的配置&#xff0c;开始做了几个Python爬取简单数据的实例&#xff0c;先做了几个最简单的&#xff0c;以后再加大难度&#xff0…

Django REST framework 版本

API 版本控制允许我们在不同的客户端之间更改行为&#xff08;同一个接口的不同版本会返回不同的数据&#xff09;。 DRF提供了许多不同的版本控制方案。 可能会有一些客户端因为某些原因不再维护了&#xff0c;但是我们后端的接口还要不断的更新迭代&#xff0c;这个时候通过…

AngularJS中的过滤器(filter)

AngularJS中的过滤器是用于对数据的格式化&#xff0c;或者筛选的函数&#xff0c;可以直接通过以下语法使用&#xff1a; {{expression|filter}} {{expression|filter1|filter2}} {{expression|filter1:param1,param2,...|filter2} 过滤器的种类有number&#xff0c;currency&…

计算机考试上传照片教程,电脑照片传到iPhone手机的详细步骤【图文】

苹果自带的iOS系统是不可以随便和电脑进行数据交换的&#xff0c;必须使用iTunes软件。许多用户为此问题困扰&#xff0c;我们有什么可以把电脑照片传到iPhone手机&#xff1f;下面我们就一起来看看把电脑照片传到iphone设备的详细步骤。具体方法如下&#xff1a;1&#xff0c;…

javaweb 导出文件名乱码的问题解决方案

fileName new String(fileName.getBytes("ISO8859-1"), "UTF-8"); 或者 String finalFileName null; if(StringUtils.contains(userAgent, "MSIE")){//IE浏览器 finalFileName URLEncoder.encode(fileName,"UTF8"); }else if(Str…

AVS 分像素运动估计优化算法

—249—AVS 分像素运动估计优化算法杨涵悦 1&#xff0c;张兆杨1&#xff0c;滕国伟2(1. 上海大学通信学院&#xff0c;上海 200072&#xff1b;2. 上海广电(集团)有限公司中央研究院&#xff0c;上海 200233)摘要&#xff1a;针对AVS 分像素运动估计的问题&#xff0c;提出一种…