Python进阶08 异常处理

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!

本文特别感谢kylinfish的纠正,相关讨论见留言区。

 

异常处理

在项目开发中,异常处理是不可或缺的。异常处理帮助人们debug,通过更加丰富的信息,让人们更容易找到bug的所在。异常处理还可以提高程序的容错性

我们之前在讲循环对象的时候,曾提到一个StopIteration的异常,该异常是在循环对象穷尽所有元素时的报错。

我们以它为例,来说明基本的异常处理。

一个包含异常的程序:

re = iter(range(5))for i in range(100):print re.next()print 'HaHaHaHa'

首先,我们定义了一个循环对象re,该循环对象将进行5次循环,每次使用序列的一个元素。

在随后的for循环中,我们手工调用next()函数。当循环进行到第6次的时候,re.next()不会再返回元素,而是抛出(raise)StopIteration的异常。整个程序将会中断

 

我们可以修改以上异常程序,直到完美的没有bug。但另一方面,如果我们在写程序的时候,知道这里可能犯错以及可能的犯错类型,我们可以针对该异常类型定义好”应急预案“。

re = iter(range(5))try:for i in range(100):print re.next()
except StopIteration:print 'here is end ',iprint 'HaHaHaHa'

在try程序段中,我们放入容易犯错的部分。我们可以跟上except,来说明如果在try部分的语句发生StopIteration时,程序该做的事情。如果没有发生异常,则except部分被跳过。

随后,程序将继续运行,而不是彻底中断。

 

完整的语法结构如下:

try:...
except exception1:...
except exception2:
...
except:...
else:... finally:...

 

如果try中有异常发生时,将执行异常的归属,执行except。异常层层比较,看是否是exception1, exception2...,直到找到其归属,执行相应的except中的语句。如果except后面没有任何参数,那么表示所有的exception都交给这段程序处理。比如:

try:print(a*2)
except TypeError:print("TypeError")
except:print("Not Type Error & Error noted")

由于a没有定义,所以是NameError。异常最终被except:部分的程序捕捉。

 

如果无法将异常交给合适的对象,异常将继续向上层抛出,直到被捕捉或者造成主程序报错。比如下面的程序

def test_func():try:m = 1/0except NameError:print("Catch NameError in the sub-function")try:test_func()
except ZeroDivisionError:print("Catch error in the main program")

子程序的try...except...结构无法处理相应的除以0的错误,所以错误被抛给上层的主程序。

 

如果try中没有异常,那么except部分将跳过,执行else中的语句。

finally是无论是否有异常,最后都要做的一些事情。

流程如下,

try->异常->except->finally

try->无异常->else->finally

 

抛出异常

我们也可以自己写一个抛出异常的例子:

print 'Lalala'
raise StopIteration
print 'Hahaha'

这个例子不具备任何实际意义。只是为了说明raise语句的作用。

StopIteration是一个类。抛出异常时,会自动有一个中间环节,就是生成StopIteration的一个对象。Python实际上抛出的,是这个对象。当然,也可以自行生成对象:

raise StopIteration()

 

总结

try: ... except exception: ... else: ... finally: ...
raise exception

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

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

相关文章

查询程序崩溃日志_PC 崩溃报告途径 amp; 临时解决方法

TC Sera (社区经理):你好!如果您在电脑游戏中遇到与 Nvidia 驱动程序相关的崩溃情况,请打开视频设置(Video Settings)中的诊断模式(Diagnostics Mode)并重新启动游戏。如果您遇到问题,请打包:%localappdata%\Gears5\Sa…

C# ConcurrentBag的实现原理

一、前言笔者最近在做一个项目&#xff0c;项目中为了提升吞吐量&#xff0c;使用了消息队列&#xff0c;中间实现了生产消费模式&#xff0c;在生产消费者模式中需要有一个集合&#xff0c;来存储生产者所生产的物品&#xff0c;笔者使用了最常见的List<T>集合类型。由于…

Linux里10个最危险的命令

全世界只有3.14 % 的人关注了数据与算法之美Linux命令行佷有用、很高效&#xff0c;也很有趣&#xff0c;但有时候也很危险&#xff0c;尤其是在你不确定你自己在正在做什么时候。推荐阅读Linux之父林纳斯自传《只是为了好玩》这篇文章将会向你介绍十条命令&#xff0c;但你最好…

arcgis xml 下载 切片_GIS开发:Arcgis的切片格式

常规的地图切片&#xff0c;存储在计算机的目录&#xff0c;一般都是以数字的模式&#xff0c;表现层级的文件夹名称&#xff0c;无外乎缩放等级(level)&#xff0c;横向的切片数(x),纵向的切片数(y)&#xff0c;例如下边的一个切片存放文件夹&#xff0c;按照level\y\x.jpg进行…

管理Apache服务器访问日志

管理Apache服务器访问日志 1&#xff0e;相关配置文件说明 一个优秀的Linux网络管理员会密切关注服务器日志系统&#xff0c;这些日志可以提供异常访问的线索。Apache可以记录所有的访问请求&#xff0c;同样&#xff0c;错误的请求也会记录。Apache配置文件中&#xff0c;需要…

《.NET内存管理宝典》在京东上架销售啦!

为什么要阅读本书正如本书第14章14.3节所提到的&#xff0c;如下类型的应用程序十分需要本书的知识。● 金融软件&#xff1a;特别是实时交易和所有需要基于大量各种数据以尽快得出答案的分析决策。● 大数据&#xff1a;虽然大数据通常都是批量、慢速处理&#xff0c;…

让你立刻爱上数学的10个算术游戏

全世界只有3.14 % 的人关注了数据与算法之美死理性派的小编经常会被问到的一个问题&#xff1a;数学到底哪里有趣了&#xff0c;数学之美又在哪里&#xff1f;这篇文章精心选择了 10 个老少咸宜的算术问题&#xff0c;以定理、趣题甚至未解之谜等各种形式带领大家窥探数学世界的…

python json方法详解_python详解json模块

我们在做工作中经常会使用到json模块&#xff0c;今天就简单介绍下json模块什么是jsonJSON &#xff0c;全称为JavaScript Object Notation&#xff0c; 也就是JavaScript 对象标记&#xff0c;它通过对象和数组的组合米表示数据&#xff0c;构造简洁但是结构化程度非常高&…

iPhone 的 Push(推送通知)功能原理浅析

第一部分&#xff1a;Push原理(以下绝大多数内容参考自、图片来自iPhone OS Reference Library)机制简介Push 的工作机制可以简单的概括为下图图中&#xff0c;Provider是指某个iPhone软件的Push服务器。 APNS 是Apple Push Notification Service&#xff08;Apple Push服务器&…

关于C#异步编程的建议

基于任务的异步编程模型 (TAP) 提供了异步代码的抽象化。你只需像往常一样将代码编写为一连串语句即可。就如每条语句在下一句开始之前完成一样&#xff0c;你可以流畅地阅读代码。编译器将执行许多转换&#xff0c;因为其中一些语句可能会开始运行并返回表示正在进行的工作的 …

编程从业五年的十四条经验,句句朴实

全世界只有3.14 % 的人关注了数据与算法之美排列不分先后&#xff1a;1. 当性能遇到问题时&#xff0c;如果能在应用层进行计算和处理&#xff0c;那就把它从数据库层拿出来。排序和分组就是典型的例子。在应用层做性能提升总是要比在数据库层容易的多。就像对于MySQL&#xff…

hashmap扩容 面试_HashMap面试,看完这一篇就够了(上)

以下HashMap源码的解析都是基于java8来讲解的。HashMap的结构是数组加链表的形式(jdk7中也是)&#xff0c;在java8中引入了红黑树&#xff0c;由于红黑树的时间复杂度是O(log n)&#xff0c;引入红黑树是为了解决在哈希冲突很严重的时候导致链表太长&#xff0c;从而引起的查找…

动态更改屏幕方向LANDSCAPE与PORTRAIT 转

动态更改屏幕方向……LANDSCAPE与PORTRAITpackage irdc.ex05_22;import android.app.Activity;import android.content.pm.ActivityInfo;import android.os.Bundle;import android.view.Display;import android.view.View;import android.widget.Button;import android.widget.…

C# action,delegate,func的用法和区别

以前我都是通过定义一个delegate来写委托的&#xff0c;但是最近看一些外国人写的源码都是用action和func方式来写&#xff0c;当时感觉对这很陌生所以看起源码也觉得陌生&#xff0c;所以我就花费时间来学习下这两种方式&#xff0c;然后发现确实代码简洁了不少。这两种方式我…

java实现红包要多少钱_Java实现抢红包算法,附完整代码(公平版和手速版)

当我们在群里抢红包时真的是手速越快红包金额越大吗&#xff1f;答案当然是并不是&#xff0c;都说了是拼手气&#xff0c;岂能是拼手速&#xff01;不过也可以有拼手速的方法二倍均值法(公平版)这是一种很合理很公平的抢红包算法了&#xff0c;绝对不会让你拼手速的&#xff0…

堆和栈概念整理

1.内存管理方式&#xff1a; 堆&#xff1a;一般由程序员分配释放&#xff0c;程序员申请时需要指明大小&#xff0c;leg,C语言中malloc函数&#xff1a;p1(char*)malloc(10),C中&#xff1a;p2new char[20].若程序员不去释放&#xff0c;当程序结束时可能由操作系统释放 &…

.Net之Swagger基础使用

介绍Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。日常可以用于后端开发人员测试接口或者前后端联调使用。从.net5开始&#xff0c;swagger已经集成到vs2019编译器中&#xff0c;可以通过勾对选项“启用OpenAPI支持”显示…

孩子不是笨,他和“最强大脑”差的是这个!

小木最近看到一则消息推送&#xff0c;说家长辅导孩子陪写作业简直就是一道“送命题”。朋友圈更是掀起了一股“提前嫁儿嫁女”的热潮。为什么孩子对数学一点兴趣也没有&#xff1f;为什么再简单的一道题&#xff0c;换个数字换个形式&#xff0c;孩子就一问三不会了&#xff1…

c++ 隐藏进程_Linux 查看进程的动态信息

前言top命令经常用来监控Linux的系统状况&#xff0c;是常用的性能分析工具&#xff0c;能够实时显示系统中各个进程的资源占用情况目录一、描述二、top命令常用字段含义三、top中的子命令四、总结五、思维导图一、描述1、top命令经常用来监控Linux的系统状况是常用的性能分析工…

给IT新人的15个建议:苦逼程序员的辛酸反省与总结

很多人表面上看着老实巴交的&#xff0c;实际上内心比谁都好强、自负、虚荣、甚至阴险。工作中见的多了&#xff0c;也就习惯了。 有一些人&#xff0c;什么事都写在脸上&#xff0c;表面上经常得罪人&#xff0c;甚至让人讨厌。但是他们所表现的又未必不是真性情。 我相信大多…