python之异常处理_Python之异常处理

异常对象

请大家运行如下代码

a = 100/0

print(a)

就会发现解释器显示如下的错误提示

Traceback (most recent call last): File "xxxxxxxxxx.py", line 1, in

a = 100/0

ZeroDivisionError: division by zero

大家要学会看解释器的报错。

这就是解释器向我们报告, 有一个 ZeroDivisionError 错误对象 或者说 异常对象 产生了。

这个 ZeroDivisionError 对象 代表的是一个除以0 的异常。 我们知道0是不能作为除数的。

因为这个问题,解释器没有办法继续执行后面的代码了。所以程序就此结束执行了。

ZeroDivisionError就是一个异常对象的类,继承自标准库里面的 Exception 类。

Python标准库中还有很多其他的异常类 都是继承自标准库里面的 Exception 类,代表各种不同类型的错误。

大家可以在命令行窗口 运行 Python 解释器交互命令行,分别输入如下代码:

xxxx

会产生 NameError,表示xxxx没有定义

dict1 = {1:1} print(dict1[2])

会产生 KeyError,表示该字典没有key为2的元素

import xxxx

会产生 ModuleNotFoundError,表示找不到xxxx这样的模块

捕获异常

解释器执行代码过程中,如果发生异常,就会导致解释器没法继续按照正常流程往下执行代码,所以解释器会结束当前线程的执行。

如果执行的程序是个单线程的程序,整个程序执行就会结束了。

如果我们在编码的时候,就预料到了某些代码运行时可能出现某些异常,就可以使用 try...except... 这样的方法来捕获和处理异常。

比如,我们要开发程序,实现一个把用户输入的身高从英尺换算成米,如下所示

while True:

miles = input('请输入英里数:')

km = int(miles) * 1.609344

print(f'等于{km}公里')

编写这段代码的时候, 我们就可以预料到,可能用户会输入非数字的字符,用int转化就会出错了,导致整个程序就退出了。

这时,我们就可以这样写

while True:

try:

miles = input('请输入英里数:')

km = int(miles) * 1.609344

print(f'等于{km}公里')

except ValueError:

print('你输入了非数字字符')

try 下面缩进的代码出现异常时,解释器会结束 try中 后续代码的执行,并检查这个异常的类型是否匹配后面的except 语句中声明的类型。

如果匹配上,就认为该异常是预先有对应的处理方案的,就执行匹配的except下面缩进的代码。从而不会结束当前线程。上面的例子中,执行 try 下面缩进的代码时,如果用户输入了 hello 这样的非数字, 就会在这行语句处

km = int(miles) * 1.609344

产生 ValueError 类型的异常, 解释器就会去查看后面的 except 语句是否声明了对 ValueError 异常的处理。

发现有, 就会执行后面缩进的代码。也就是这句代码

print('你输入了非数字字符')

except 后面缩进的代码 就是对这种类型错误 的一种处理。

既然程序已经知道如何处理这种问题, 就不需要结束执行,只需要执行完 处理代码后, 进行原来正常的执行流程。

在这里,就是继续 while True 循环。

如果我们开发程序的时候,估计某个代码段中可能出现好几种类型的异常,可以使用多个except 代码段,分别捕获多种类型的异常,如下

try:

choice = input('输入你的选择:')

if choice == '1':

100/0

elif choice == '2':

[][2]

except ZeroDivisionError: print ('出现 ZeroDivisionError') except IndexError : print ('出现 IndexError')

如果 输入’1’, 则会产生 ZeroDivisionError 异常, 就会被 except ZeroDivisionError 捕获,执行对应的代码

print ('出现 ZeroDivisionError')

如果 输入’2’, 则会产生 IndexError 异常, 就会被 except IndexError 捕获,执行对应的代码

print ('出现 IndexError')

获取异常对象

我们使用except 语句匹配异常类型的时候, 可以使用as关键字,后面加一个变量名,如下所示:

try:

100/0

except ZeroDivisionError as e:

print (f'异常对象信息:{e}')

这样,运行代码的时候,当try中的语句产生异常对象时,就会 把产生的异常对象赋值给as后的变量。

上面的代码,运行输出

异常对象信息:division by zero

产生的异常对象赋值给了变量 e。

这样我们就可以在后续的代码中得到产生的异常对象的信息。

匹配所有异常

如果我们在写一段代码的时候,不知道这段代码会抛出什么样的异常,并且我们不希望程序因为异常而中止。

这时我们可以匹配所有类型的异常,这样任何类型的异常发生都不会终止程序了。 如下:

try:

100/0

except Exception as e:

print('未知异常:', e)

因为所有的异常都是 Exception 的子类。 所以 Exception能匹配所有类型的异常。

except 为空,也可以匹配所有类型的异常,而且可以通过traceback库,显示异常的信息和异常产生处的函数调用栈的信息,如下

import traceback

try:

100/0

except:

print(traceback.format_exc())

上面的代码会打印出导致异常的详细的函数调用栈的信息,如下

Traceback (most recent call last):

File "xxxx/xxx.py", line 4, in

100/0

ZeroDivisionError: division by zero

自定义异常

异常类型都是 继承自Exception的类,表示各种类型的错误。

我们也可以自己定义异常,比如我们写一个用户注册的函数, 要求用户输入的电话号码只能是中国的电话号码,并且电话号码中不能有非数字字符。

可以定义下面这两种异常类型:

# 异常对象,代表电话号码有错误的字符

class InvalidCharError(Exception):

pass

# 异常对象,代表电话号码非中国号码

class NotChinaTelError(Exception):

pass

定义了上面的异常,当用户输入电话号码时,出现相应错误的时候,我们就可以使用raise 关键字来抛出对应的自定义异常

def register():

tel = input('请注册您的电话号码:')

# 如果有非数字字符

if not tel.isdigit():

raise InvalidCharError

# 如果不是以86开头,则不是中国号码

if not tel.startswith('86'):

raise NotChinaTelError

return tel

try:

ret = register()

except InvalidCharError:

print('电话号码中有错误的字符')

except NotChinaTelError:

print('非中国手机号码')

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

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

相关文章

西安北苑附近哪有计算机学校,太古城北(北苑地铁站)附近大学院校

最佳答案:太古城北(北苑地铁站)附近有长安大学-团委,长安大学渭水校区,长安大学计算机实验教学中心,陕西科技大学化学与化工学院,陕西科技大学实验楼1A,陕西科技大学实验楼2A,陕西科技大学-工程训练中心,陕西科技大学管理学院,陕西科技大学西安校区,陕西科技大学信息…

http://www.od85c.com.cn/html/,OllyDbg script for unpacking Enigma 4.xx and 5.xx

[Asm] 纯文本查看 复制代码// Enigma Protector 4.xx and 5.XX unpacker by GIV (some parts are from LCF-AT Alternativ 1.1 script and the API fix is from SHADOW_UA script)// January 22 2016// givreversing.ro// PRIVATE// 3D00F000007E13B800000100 - API COMPARE AN…

hive 神盾特工局_《神盾局特工》第三季剧终惊人:两位超高人气的角色离开

原标题:《神盾局特工》第三季剧终惊人:两位超高人气的角色离开当“神盾局特工”几周前宣布一位主要角色将在本季最后一集中死亡时,粉丝开始猜测这个角色将会是谁。当一切真相揭开时,此剧对于“升天”这个词的承诺竟然有双重意义,第…

计算机软件著作权特征,计算机软件著作权的法律特征是什么

计算机软件著作权的法律特征是什么一、权利内容的法定性法定性有狭义、广义之分。作为一个法律概念的“权利”,都是由国家的法律所规定的,不存在任何法律规定之外的权利,譬如没有所谓“天赋”的权利。从这个意义上讲,凡法律上的权…

html img和背景图处理图片不拉伸_css 背景图不拉伸自适应屏幕大小

效果图全屏:背景图尺寸大于屏幕尺寸,背景图只显示跟屏幕一样大小内容小屏时:如效果图所示,图片并没有发生压缩、或者缩小比例,它只是显示跟屏幕尺寸大小的内容,至于如何控制缩小浏览器时图片的变化&#xf…

2017计算机基本配置检测表,2017整理如何查看电脑的硬件配置信息?查看电脑硬件配.ppt...

2017整理如何查看电脑的硬件配置信息?查看电脑硬件配如何查看电脑的硬件配置信息?查看电脑硬件配 如何查看电脑的硬件配置信息?查看电脑硬件配置信息的方法 电脑培训 n9byl电脑的配置如何看呢?很多没有什么电脑基础的人是一个大的问题,有不少…

棒棒糖球球机器人_球球大作战刷棒棒糖_球球大作战刷龙蛋攻略

玩过球球大作战的玩家们都知道我们要获得棒棒糖和龙蛋是很不容易的,那么游戏中我们要怎么免费获得龙蛋和棒棒糖呢,而通过怎么才能快速获得龙蛋和棒棒糖,同时通过刷的方式要怎么操作呢,接下来就由小编一起来详细给大家介绍吧。游戏…

计算机二级web考点,2018年计算机二级考试WEB考点:web应用程序状态管理方式

2017年计算机等级考试已经结束,出国留学网为考生们整理了2018年计算机二级考试WEB考点,希望能帮到大家,想了解更多资讯,请关注我们,小编会及时更新哦。2018年计算机二级考试WEB考点:web应用程序状态管理方式…

mac笔记本怎么外接显示屏_win to go的安装与Macbook pro外接eGPU开启

更新:wintogo中eGPU的驱动(针对15.6 MacBook pro,且只针对于mantiz这款显卡坞) 在不插入显卡的情况下,安装 win to go将 Windows 10升级 ⾄预览版 ,并完成所有Windows 10 更新,之后禁用windows更…

中职计算机教学工作随笔,教学随笔(精选15篇)

教学随笔(精选15篇)教学是教师的教和学生的学所组成的一种人类特有的人才培养活动。下面和小编一起来看教育教学随笔(精选15篇),希望有所帮助!教学随笔 篇1今天是我的早读,到学校了,小朋友还没有静下来读书。我挥手让小朋友们静下…

array 前端面试题_web前端开发面试题汇总

前端面试题汇总第一部分HTML&CSS1. 浏览器分类浏览器:IE,Chrome,FireFox,Safari,Opera。内核:Trident,Gecko,Presto,Webkit。2.行内元素和块级元素行内元素&#xff…

一个男的和计算机对话,父与子的对话:计算机算法

上一封信我提到了电脑必须有三样要素:输入、输出和算法。算法是最核心的部分。没有算法,电脑不会知道你的输入究竟该返回什么样的输出。你 最近数学期中考考得相当不错,你应该注意到,“应用题”这种题目,本质上考的就是…

python3编程入门先学什么_自学编程入门,先学什么语言好?

先说结论吧: 其实任何一个你能持之以恒学习的编程语言都行,但我会建议从 HTML,CSS 和 Python 开始入门。原因如下:学习编程就像学骑自行车,对新手来说最重要的是持之以恒的练习。那如何持之以恒呢?我建议从三方面考虑这个问题:选择…

计算机公式大小写,excel大写金额公式

excel大写金额公式是【IF(MOD(A2,1)0,TEXT(INT(A2),"[DBNUM2]")&"元"&"整",TEXT(INT(A2),"[DBNUM2]")&"元"&TEXT(MID(A2,LEN(INT(A2))2,1),"[DBNUM2]D角")&TEXT(MID(A2,LEN(INT(A2))3,1),&qu…

python装饰器的通俗理解_python装饰器的通俗理解

在学习Python的过程中,我相信有很多人和我一样,对Python的装饰器一直觉得很困惑,我也是困惑了好久,并通过思考和查阅才能略有领悟,我希望以下的内容会对你有帮助,我也努力通过通俗的方式使得对Python装饰器…

centos8安装文件服务器,centos8 服务器环境部署

1、jdk1.8 检查 yum 中有没有 java1.8 包yum list java-1.8*开始安装yum install java-1.8.0-openjdk* -yyum install redisyum install epel-releasesystemctl start redissystemctl status redis自启动systemctl enable redis安装数据库1、安装RPMyum install https://downlo…

vrchat模型保存_轻松简单自己上传VRChat的Avatar

有Unity就够了,不用BlenderPosted by SunnyRx on December 28, 2019

hdfs文件如何导出到服务器,[Hadoop] 如何将 HDFS 文件导出到 Windows文件系统

介绍如何在 Windows 环境中, 将保存在 HDFS 上的文件导出到本机上数据导入到 HDFS 后当然也要有方法将数据从 HDFS 导出到本机系统上在 HADOOP JAVA API 所提供的 FileSystem 类就提供 copyToLocalFile 函数将文件复制回本机文件系统理论上这是可以轻易的做到这件事情但实际使…

用纸筒做机器人_365天,每天都可以玩出新花样,卷纸筒就是这么牛的神器!

一旦有了娃,家里就会出现一大堆的玩具!随着孩子的长大,玩具也会越积越多,尤其是一些塑料玩具,恐龙,小动物,洋娃娃......你可以在房间的任一个角落,发现它们的踪影。而且,…

labelme 语义分割数据集_RangeNet++: 快速精确的雷达数据语义分割(IROS 2019)

本文主要介绍一篇关于雷达数据语义分割的文章。这篇文章将点云通spherical projection投到2D平面后,先通过高效的CNN网络得出segmentation结果,然后还原出点云的segmentation结果,最后用一个精巧的knn-search算法,对结果进行优化。…