金丹期前期:1.9、python语言-python程序中的异常与捕获
一、异常简介
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程序中的异常与捕获相关推荐
- python缩进在程序中长度统一且强制使用_Python习题纠错1
February, 1991 0.9.1 2.Python语言的缩进只要统一即可,不一定是4个空格(尽管这是惯例). Python缩进在程序中长度统一且强制使用. 3.IPO:Input Proces ...
- python语言-Python语言的特点有哪些?
python是一种解释性.交互式.面向对象的跨平的语言.近年来,热持续上涨,人才需求量也祝年攀升,备受程序员的追捧.那么python语言的特点有哪些呢?我们下面来说一下. Python语言主要有以下9 ...
- python语言在abaqus中的应用 仿真秀_Python语言在Abaqus中的应用(18讲)-掌握Python编程实现ABAQUS高效仿真...
本课适合那些人学习: 1.理解有限元基本概念.熟悉Abaqus/CAE分析流程的工程师: 2.学习型仿真工程师 3.使用Abaqus软件进行有限元分析的工程师 4.高校教师.博(硕)士研究生 对学员的 ...
- 在Python网络爬虫程序中使用线程池
在Python网络爬虫程序中使用线程池 一.为什么需要使用线程池 二.线程池的使用 2.1 线程池的类与方法 2.2 使用线程池的一般步骤 三.在爬虫程序中使用线程池的实例 一.为什么需要使用线程池 ...
- python在abaqus中的应用代码下载_Python-(source-code)-in--Abaqus Python语言在Abaqus中的应用(源码) - 下载 - 搜珍网...
Python语言在Abaqus中的应用 (源码)/ Python语言在Abaqus中的应用 (源码)/Python语言在Abaqus中的应用 (源码)/ Python语言在Abaqus中的应用 (源码 ...
- 以下python语言关键字在异常处理_【单选题】以下 Python 语言关键字在异常处理结构中用来捕获特定类型异常的选项是: ( )...
问题:[单选题]以下 Python 语言关键字在异常处理结构中用来捕获特定类型异常的选项是: ( ) 更多相关问题 进程从运行状态变为等待的原因可能是() 进程调度主要负责() 在下列叙述中,错误的一 ...
- python 内存溢出能捕获吗_从0基础学习Python (19)[面向对象开发过程中的异常(捕获异常~相关)]...
从0基础学习Python (Day19) 面向对象开发过程中的=>异常 什么是异常 当程序在运行过程中出现的一些错误,或者语法逻辑出现问题,解释器此时无法继续正常执行了,反而出现了一些错误的 ...
- C语言 在程序中打开网页,模拟鼠标点击、键盘输入
C语言 在程序中打开网页,模拟鼠标点击.键盘输入 一.简述 记--使用C语言 打开指定网页,并模拟鼠标点击.键盘输入.实现半自动填写账号密码,并登录网站(当然现在的大部分网站都有验证码 ...
- c语言中延时时间计算,能精确计算C语言延时程序中延时时间的小工具(转)
能精确计算C语言延时程序中延时时间的小工具 Emu51Form是一个软仿真计时器 具体使用方法为: 1.打开 keil\tools,ini 文件,在它的c51栏中加入 AGSI9=Emu51Form. ...
最新文章
- Python中requests包的安装
- anaconda spyder使用协程报错解决:RuntimeError: This event loop is already running
- Thymeleaf页面级联属性
- 中国大学MOOC 编译原理 第6讲测验
- c语言支持默认参数吗,嵌入式C语言可以带“默认参数”的函数吗
- 2017CCPC秦皇岛 L题One-Dimensional MazeZOJ3992【模拟】
- Hough(霍夫变换) 基于Opencv2.4.9 和VS2012平台下编写
- AOF -- Redis 设计与实现
- AI人工智能技术可以做什么
- 水经注全国离线地图都有哪些地图数据?
- PyQt上位机软件开发简介
- oracle18c 配置,0报错!Oracle 18C 完全安装指南及常见问题汇总
- 硬盘分区大学计算机,电脑硬盘容量要怎么选?又要怎么硬盘合理分区?今天我再说一次!...
- 怎样建网站?(超详细)
- 成都市第五人民医院双活数据中心建设方案
- html5页面 学生作品,最完整长页面H5制作教程来啦!
- 【cocos creator实战】记录微信小游戏登录授权的开发-小游戏审核
- 阿里云OSS服务器上传图片并获取路径(SpringBoot)(☆)
- 四十三、Fluent增强收敛性-伪瞬态计算
- java escpos_java – 设置字符代码表以在ESC / POS打印机中打印非拉丁字符