第二十九节 异常Exception

  • 前言
  • 实践

前言

我们在写代码时不可避免地会出错,这时候编译器便会抛出异常并中断程序的执行。针对这种情况,我们可以采用异常处理的方式捕捉程序中的异常信息,并将异常信息打印出来供程序员分析,同时呢还要避免因为程序抛出异常而中断其继续向下执行。异常检测代码结构如下:

try:要检测异常信息的代码段
except 异常信息 as e:要打印的报错信息供程序员分析
else:如果要检测的代码段没有发生异常,那就执行这部分代码
finally:无论程序是否有异常,这里的代码均可以执行

实践

我们以分母为0为例学习异常处理的相关内容,众所周知在除法中分母是不能为0的,若分母为0,程序便会抛出异常信息:

numerator = int(input("Enter a number to divide: "))
denominator = int(input("Enter a number to divide by: "))
result = numerator / denominator
print(result)
>>> Enter a number to divide: 5
>>> Enter a number to divide by: 0
>>> ZeroDivisionError: division by zero

可见程序抛出了异常信息ZeroDivisionError并且中断执行。此时我们便可以通过try-except结构来捕捉异常信息:

try:numerator = int(input("Enter a number to divide: "))denominator = int(input("Enter a number to divide by: "))result = numerator / denominator
except ZeroDivisionError as e:print("You can't divide by zero! idiot!")
>>> Enter a number to divide: 5
>>> Enter a number to divide by: 0
>>> You can't divide by zero! idiot!

可见此时程序并没有中断,当其发现程序中有ZeroDivisionError时,便执行print("You can't divide by zero! idiot!")这行代码用于提示程序员发生了除零错误。
那么如果我们不小心把除数写成了字符串会发生什么呢?

numerator = int(input("Enter a number to divide: "))
denominator = int(input("Enter a number to divide by: "))
result = numerator / denominator
print(result)
>>> Enter a number to divide: 5
>>> Enter a number to divide by: david
>>> ValueError: invalid literal for int() with base 10: 'david'

可见代码抛出了ValueError,提示程序员这里应该是int型数据而不是字符串,那么我们同样可以使用异常处理方式捕捉这个异常信息:

try:numerator = int(input("Enter a number to divide: "))denominator = int(input("Enter a number to divide by: "))result = numerator / denominator
except ZeroDivisionError as e:print("You can't divide by zero! idiot!")
except ValueError as e:print("Enter only numbers plz")
>>> Enter a number to divide: 5
>>> Enter a number to divide by: david
>>> Enter only numbers plz

不难发现程序捕捉到了这个异常信息,并打印出Enter only numbers plz,用于提醒用户只能输入数字,不能输入字符串。其实Python中包含了许许多多的异常信息用于帮助程序员分析代码,如果我们想让代码检测所有的异常信息,那么就用到了下述代码:

try:numerator = int(input("Enter a number to divide: "))denominator = int(input("Enter a number to divide by: "))result = numerator / denominator
except ZeroDivisionError as e:# 用于打印程序自带的异常信息print(e)print("You can't divide by zero! idiot!")
except ValueError as e:print(e)print("Enter only numbers plz")
except Exception as e:print(e)print("something went wrong :(")

也就是不指定特定的异常信息,用Exception来代替,这样做的好处就是程序即便发现了异常也不会中断会继续执行下去。这里需要注意的是,在判断异常时,一定是先判断是否是某一类异常,最后再判断是否是一个异常信息。那么如果程序没有异常时,我们希望它能执行的代码放在else语句下边:

try:numerator = int(input("Enter a number to divide: "))denominator = int(input("Enter a number to divide by: "))result = numerator / denominator
except ZeroDivisionError as e:print(e)print("You can't divide by zero! idiot!")
except ValueError as e:print(e)print("Enter only numbers plz")
except Exception as e:print(e)print("something went wrong :(")
else:print(result)
>>> Enter a number to divide: 5
>>> Enter a number to divide by: 1
>>> 5.0

可见,当我们的输入都合法时,程序就会得到两个数相除的计算结果并打印到控制台。其实我们还可以书写一些代码,这些代码无论程序是否发生异常,他们都会被执行,这些代码需要放在finally的下面:

try:numerator = int(input("Enter a number to divide: "))denominator = int(input("Enter a number to divide by: "))result = numerator / denominator
except ZeroDivisionError as e:print(e)print("You can't divide by zero! idiot!")
except ValueError as e:print(e)print("Enter only numbers plz")
except Exception as e:print(e)print("something went wrong :(")
else:print(result)
finally:print("This will always execute")
>>> Enter a number to divide: 5
>>> Enter a number to divide by: 1
>>> 5.0
>>> This will always execute>>> Enter a number to divide: 5
>>> Enter a number to divide by: 0
>>> division by zero
>>> You can't divide by zero! idiot!
>>> This will always execute

以上便是异常的全部内容,感谢大家的收藏、点赞、评论。我们下一节将介绍文件检测(File Detection),敬请期待~

Python编程基础:第二十九节 异常Exception相关推荐

  1. 风炫安全web安全学习第二十九节课 CSRF防御措施

    风炫安全web安全学习第二十九节课 CSRF防御措施 CSRF防御措施 增加token验证 对关键操作增加token验证,token值必须随机,每次都不一样 关于安全的会话管理(SESSION) 不要 ...

  2. 大白话5分钟带你走进人工智能-第二十九节集成学习之随机森林随机方式 ,out of bag data及代码(2)

              大白话5分钟带你走进人工智能-第二十九节集成学习之随机森林随机方式 ,out  of  bag  data及代码(2) 上一节中我们讲解了随机森林的基本概念,本节的话我们讲解随机森 ...

  3. Scala入门到精通——第二十九节 Scala数据库编程

    本节主要内容 Scala Mavenproject的创建 Scala JDBC方式訪问MySQL Slick简单介绍 Slick数据库编程实战 SQL与Slick相互转换 本课程在多数内容是在官方教程 ...

  4. 第二十九节:Java基础知识-类,多态,Object,数组和字符串

    前言 Java基础知识-类,多态,Object,数组和字符串,回顾,继承,类的多态性,多态,向上转型和向下转型,Object,数组,多维数组,字符串,字符串比较. 回顾 类的定义格式: [类的修饰符] ...

  5. python中data.find_all爬取网站为空列表_Python网络爬虫之Scrapy 框架-分布式【第二十九节】...

    1. 介绍scrapy-redis框架 scrapy-redis 一个三方的基于redis的分布式爬虫框架,配合scrapy使用,让爬虫具有了分布式爬取的功能. github地址: https://g ...

  6. Python编程基础:第七节 字符串切片String Slicing

    第七节 字符串切片String Slicing 前言 实践 前言 我们有时候需要对一个字符串进行切片,取其一部分作为新的字符串进行处理.例如从姓名中分别提取姓和名,从网站域名中提取网站名称等等. 实践 ...

  7. Python编程基础:第六节 math包的基础使用Math Functions

    第六节 math包的基础使用 前言 实践 前言 我们通常会对数值型变量进行计算,这里我们给出一些常用的函数用于辅助你的计算过程.常用的数学计算函数均在math包. 实践 首先我们导入math包,并定义 ...

  8. JAVA 基础 / 第二十九课:接口与继承 / JAVA中的对象转型

    2018-03-19 一.明确引用类型与对象类型的概念 引用类型与对象类型的概念 在这个例子里,有一个对象 new ADHero(), 同时也有一个引用ad 对象是有类型的, 是ADHero 引用也是 ...

  9. Python编程基础:第十七节 集合Set

    第十七节 集合Set 前言 实践 前言 我们本节一起来学习集合的相关内容,集合简而言之就是一种能够存放数据的数据结构,其中的数据没有索引,没有顺序,互不相同. 实践 我们来创建两个集合: utensi ...

最新文章

  1. Squid故障与解决方法汇总
  2. 联合体union和大小端(big-endian、little-endian)
  3. Tesseract-OCR 3.04简单使用举例(读入图像输出识别结果)
  4. (五)Docker镜像管理2之nginx镜像制作
  5. 关于知识图谱,我们接下来该研究什么?斯坦福教授们给出了答案
  6. 素数 c语言 时间少,C语言判断素数怎么优化时间,1000000以内,不用代码,指点一下就好...
  7. 最全的常用正则表达式大全——包括校验数字、字符、一些特殊的需求等等
  8. 030_《Delphi COM深入编程》
  9. FSMC实现8080时序驱动SSD1963(LCD驱动芯片)--原理->编码
  10. 4600万台销量!树莓派炼成之路
  11. 你知道几个中文编程语言,快来瞧瞧这些有趣的中文编程语言。
  12. 比较全的敏捷概念知识总结
  13. 汽车模具翼子板丨门轴侧棱线不顺的原因?附解决方案
  14. OA系统项目实施的难点和解决办法
  15. 上升时间测量与示波器带宽
  16. mongoDB 4.0 开启远程访问
  17. csapp bomb lab (《深入理解计算机系统》lab2)
  18. Android中使用微信H5支付时支付结果刷新问题
  19. 高数笔记(九):不定积分,分部积分法,有理函数的积分
  20. 泽塔云CEO查乾:2019年超融合进入成熟市场,GPU云带来千亿级市场

热门文章

  1. CSP认证201503-1 图像旋转[C++题解]:模拟
  2. leetcode 6 Z 字形变换 c代码
  3. wsl子系统添加开机启动任务
  4. html 中写样式,css样式中黑体怎么写
  5. linux运行cmd文件sh文件目录,在Windows上,如何执行.sh文件?
  6. python迷宫问题的所有路径_python——迷宫问题总结
  7. python运用实例视频_python爬视频实例
  8. python编辑器和终端_从python curses程序运行终端文本编辑器
  9. adnroidstudio debug手机就自动退出程序_苹果官方表示 iPhone关闭后台程序或将缩短电池寿命...
  10. 为安卓应用添加手势密码功能,遇到的一些问题以及解决方法