一、异常简介

1、一个异常的例子

当如下的Python程序在运行时检测到一个错误,一般这时候解释器就无法继续执行代码了,会出现一些错误的提示,这就是所谓的"异常"。

#! /usr/bin/python3print('========1========')
open('123.txt','r')
print('========2========')

出现错误:

================
Traceback (most recent call last):File "./8try.py", line 4, in <module>open('123.txt','r')
FileNotFoundError: [Errno 2] No such file or directory: '123.txt'

例如:读取一个不存在的文件或者用一个数除以0等错误都属于异常。

比较常见的异常类型如下:

AttributeError 试图访问一个对象没有的属性,比如foo.x,但是foo没有属性xIOError 输入/输出异常;基本上是无法打开文件ImportError 无法引入模块或包;基本上是路径问题或名称错误IndentationError 语法错误(的子类) ;代码没有正确对齐IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]KeyError 试图访问字典里不存在的键KeyboardInterrupt Ctrl+C被按下NameError 尝试访问一个没有申明的变量SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)TypeError 传入对象类型与要求的不符合UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它ValueError 传入一个调用者不期望的值,即使值的类型是正确的

2、try...except捕获单个异常

把可能出现问题的代码,放在try中,把处理异常的代码,放在except中,修改代码成如下所示:

#! /usr/bin/python3try:print('========1========')open('123.txt','r')print('========2========')
except IOError:print('========3========')

执行结果:

========1========
========3========

可以看出:其实代码执行到open函数是没有继续执行下去,然后执行到了处理异常的代码中了,这样至少代码不会中断了

3、try...except捕获多个异常

#! /usr/bin/python3try:print('========1========')
#       open('123.txt','r')print('========2========')print(num)print('========3========')
except  (NameError, IOError):print('========4========')

运行结果如下:

========1========
========2========
========4========

关键词:多个异常时候,使用元组将它们组合起来

4、使用as获取捕获到的异常的基本信息

#! /usr/bin/python3try:print('========1========')
#       open('123.txt','r')print('========2========')print(num)print('========3========')
except  (NameError, IOError) as result:print(result)

运行结果:

========1========
========2========
name 'num' is not defined

5、在try...except...中没有捕获到异常,那么就执行else中的代码

#! /usr/bin/python3num = 100
try:print('========1========')
#       open('123.txt','r')print('========2========')print(num)print('========3========')
except  (NameError, IOError) as result:print(result)
else:print('=====NO ERROR======')

执行结果:

========1========
========2========
100
========3========
=====NO ERROR======

6、在try...except...中不管有没有捕获到异常,都执行finally中的代码

无异常的代码:

#! /usr/bin/python3num = 100
try:print('========1========')
#       open('123.txt','r')print('========2========')print(num)print('========3========')
except  (NameError, IOError) as result:print(result)
else:print('=====NO ERROR======')
finally:print('======Forever=====')

有异常的代码:

#! /usr/bin/python3#num = 100
try:print('========1========')
#       open('123.txt','r')print('========2========')print(num)print('========3========')
except  (NameError, IOError) as result:print(result)
else:print('=====NO ERROR======')
finally:print('======Forever=====')

执行结果都是

======Forever=====

二、异常的传递

主要是在函数嵌套和try...except嵌套中传递

#! /usr/bin/python3def test1():print("----test1-1----")print(num)print("----test1-2----")def test2():print("----test2-1----")test1()print("----test2-2----")def test3():try:print("----test3-1----")test1()print("----test3-2----")except Exception as result:print("捕获到了异常,信息是:%s"%result)print("----test3-2----")test3()print("------华丽的分割线-----")test2()
  • 如果try嵌套,那么如果里面的try没有捕获到这个异常,那么外面的try会接收到这个异常,然后进行处理,如果外边的try依然没有捕获到,那么再进行传递。。。
  • 如果一个异常是在一个函数中产生的,例如函数A---->函数B---->函数C,而异常是在函数C中产生的,那么如果函数C中没有对这个异常进行处理,那么这个异常会传递到函数B中,如果函数B有异常处理那么就会按照函数B的处理方式进行执行;如果函数B也没有异常处理,那么这个异常会继续传递,以此类推。如果所有的函数都没有处理,那么此时就会进行异常的默认处理,即通常见到的那样
  • 注意观察上图中,当调用test3函数时,在test1函数内部产生了异常,此异常被传递到test3函数中完成了异常处理,而当异常处理完后,并没有返回到函数test1中进行执行,而是在函数test3中继续执行

三、自定义异常并抛出(raise)

你可以用raise语句来引发一个异常。异常/错误对象必须有一个名字,且它们应是Error或Exception类的子类.

#! /usr/bin/python3class ShortInputException(Exception):'''自定义的异常类'''def __init__(self, length, atleast):#super().__init__()self.length = lengthself.atleast = atleastdef main():try:s = input('请输入 --> ')if len(s) < 3:# raise引发一个你定义的异常raise ShortInputException(len(s), 3)except ShortInputException as result:#x这个变量被绑定到了错误的实例print('ShortInputException: 输入的长度是 %d,长度至少应是 %d'% (result.length, result.atleast))else:print('没有异常发生.')main()

运行结果:

linbo@linbo-virtual-machine:~/python/python1$ ./9raise.py
请输入 --> 12
ShortInputException: 输入的长度是 2,长度至少应是 3

四、在异常中抛出异常

有时候,捕获到了异常但是不想去处理这个异常,重新抛出去让另一层的异常处理函数去处理,示例代码如下:

#! /usr/bin/python3class Test(object):def __init__(self, switch):self.switch = switch #开关def calc(self, a, b):try:return a/bexcept Exception as result:if self.switch:print("捕获开启,已经捕获到了异常,信息如下:")print(result)else:#重新抛出这个异常,此时就不会被这个异常处理给捕获到,从而触发默>认的异常处理raisea = Test(True)
a.calc(11,0)print("----------------------华丽的分割线----------------")a.switch = False
a.calc(11,0)

运行结果如下:

捕获开启,已经捕获到了异常,信息如下:
division by zero
----------------------华丽的分割线----------------
Traceback (most recent call last):File "./9raise.py", line 24, in <module>a.calc(11,0)File "./9raise.py", line 8, in calcreturn a/b
ZeroDivisionError: division by zero

关键词:上面程序使用switch打开与关闭处理异常,在关闭异常处理时,捕获到之后直接又抛出了。

金丹期前期:1.9、python语言-python程序中的异常与捕获相关推荐

  1. python缩进在程序中长度统一且强制使用_Python习题纠错1

    February, 1991 0.9.1 2.Python语言的缩进只要统一即可,不一定是4个空格(尽管这是惯例). Python缩进在程序中长度统一且强制使用. 3.IPO:Input Proces ...

  2. python语言-Python语言的特点有哪些?

    python是一种解释性.交互式.面向对象的跨平的语言.近年来,热持续上涨,人才需求量也祝年攀升,备受程序员的追捧.那么python语言的特点有哪些呢?我们下面来说一下. Python语言主要有以下9 ...

  3. python语言在abaqus中的应用 仿真秀_Python语言在Abaqus中的应用(18讲)-掌握Python编程实现ABAQUS高效仿真...

    本课适合那些人学习: 1.理解有限元基本概念.熟悉Abaqus/CAE分析流程的工程师: 2.学习型仿真工程师 3.使用Abaqus软件进行有限元分析的工程师 4.高校教师.博(硕)士研究生 对学员的 ...

  4. 在Python网络爬虫程序中使用线程池

    在Python网络爬虫程序中使用线程池 一.为什么需要使用线程池 二.线程池的使用 2.1 线程池的类与方法 2.2 使用线程池的一般步骤 三.在爬虫程序中使用线程池的实例 一.为什么需要使用线程池 ...

  5. python在abaqus中的应用代码下载_Python-(source-code)-in--Abaqus Python语言在Abaqus中的应用(源码) - 下载 - 搜珍网...

    Python语言在Abaqus中的应用 (源码)/ Python语言在Abaqus中的应用 (源码)/Python语言在Abaqus中的应用 (源码)/ Python语言在Abaqus中的应用 (源码 ...

  6. 以下python语言关键字在异常处理_【单选题】以下 Python 语言关键字在异常处理结构中用来捕获特定类型异常的选项是: ( )...

    问题:[单选题]以下 Python 语言关键字在异常处理结构中用来捕获特定类型异常的选项是: ( ) 更多相关问题 进程从运行状态变为等待的原因可能是() 进程调度主要负责() 在下列叙述中,错误的一 ...

  7. python 内存溢出能捕获吗_从0基础学习Python (19)[面向对象开发过程中的异常(捕获异常~相关)]...

    从0基础学习Python (Day19) 面向对象开发过程中的=>异常 什么是异常 ​ 当程序在运行过程中出现的一些错误,或者语法逻辑出现问题,解释器此时无法继续正常执行了,反而出现了一些错误的 ...

  8. C语言 在程序中打开网页,模拟鼠标点击、键盘输入

    C语言 在程序中打开网页,模拟鼠标点击.键盘输入 一.简述         记--使用C语言 打开指定网页,并模拟鼠标点击.键盘输入.实现半自动填写账号密码,并登录网站(当然现在的大部分网站都有验证码 ...

  9. c语言中延时时间计算,能精确计算C语言延时程序中延时时间的小工具(转)

    能精确计算C语言延时程序中延时时间的小工具 Emu51Form是一个软仿真计时器 具体使用方法为: 1.打开 keil\tools,ini 文件,在它的c51栏中加入 AGSI9=Emu51Form. ...

最新文章

  1. Python中requests包的安装
  2. anaconda spyder使用协程报错解决:RuntimeError: This event loop is already running
  3. Thymeleaf页面级联属性
  4. 中国大学MOOC 编译原理 第6讲测验
  5. c语言支持默认参数吗,嵌入式C语言可以带“默认参数”的函数吗
  6. 2017CCPC秦皇岛 L题One-Dimensional MazeZOJ3992【模拟】
  7. Hough(霍夫变换) 基于Opencv2.4.9 和VS2012平台下编写
  8. AOF -- Redis 设计与实现
  9. AI人工智能技术可以做什么
  10. 水经注全国离线地图都有哪些地图数据?
  11. PyQt上位机软件开发简介
  12. oracle18c 配置,0报错!Oracle 18C 完全安装指南及常见问题汇总
  13. 硬盘分区大学计算机,电脑硬盘容量要怎么选?又要怎么硬盘合理分区?今天我再说一次!...
  14. 怎样建网站?(超详细)
  15. 成都市第五人民医院双活数据中心建设方案
  16. html5页面 学生作品,最完整长页面H5制作教程来啦!
  17. 【cocos creator实战】记录微信小游戏登录授权的开发-小游戏审核
  18. 阿里云OSS服务器上传图片并获取路径(SpringBoot)(☆)
  19. 四十三、Fluent增强收敛性-伪瞬态计算
  20. java escpos_java – 设置字符代码表以在ESC / POS打印机中打印非拉丁字符

热门文章

  1. css:hover鼠标放上去字体变大 transform: scale
  2. AirPods:如何在设备之间自动切换?
  3. Python爱心源码抖动图
  4. 机器学习:k邻近算法(KNN)
  5. html与css重置代码,HTML CSS标签类型转换、样式重置 、前段规范(示例代码)
  6. CTR预估的几种方式
  7. 如何通过经纬度获取地址信息?
  8. Linux根目录与家目录的区别
  9. vue 项目内存溢出_Vue/React 项目运行或者打包出现内存溢出解决方案
  10. 数字+文化 跨界融合为文化产业注入新活力