热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

what'sthepython之异常处理

what'sthe异常python程序中会出现异常,即bug。若出现异常程序就报错,异常之后的代码就不会继续往下执行,这是一个正常程序不允许出现的,但是在某些程序交互的时候

what‘s the 异常

  python程序中会出现异常,即bug。若出现异常程序就报错,异常之后的代码就不会继续往下执行,这是一个正常程序不允许出现的,但是在某些程序交互的时候难免会因为用户输入问题产生异常,这个时候我们就要在程序中加入异常处理的代码来防止因为产生异常而使我们的程序崩溃的情况发生。

  异常即错误,错误分两种,一种为语法错误,一种为逻辑错误。

语法错误:程序员在编写代码时因为操作不当产生的错误,此时产生的异常都是相当低级的,处理异常的方式就是人为的手动改正。在编写程序的时候我们一定要小心注意,语法错误是非常低级的行为,完全可以避免,犯这个错误只会是你的工作量变大,徒增加班的时间

逻辑错误:在程序交互中因为用户输入不完整或输入的数据类型错误而产生的异常,或者因为某些原因导致需要计算的数据类型不同导致异常等等

#用户输入不完整(比如输入为空)或者输入非法(输入不是数字)
num=input(">>: ")
int(num)

#无法完成计算
res1=1/0
res2=1+str

  在python中,不同类型的异常可以用不同的类型(python中统一了类与类型,类型即类)去标识,不同的类对象标识不同的异常,一个异常标识一种错误。

  比如:索引异常——IndexError,关键字异常——KeyError,值异常——ValueError等等

常用异常列举如下:

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

更多异常:

技术分享图片技术分享图片
ArithmeticError
AssertionError
AttributeError
BaseException
BufferError
BytesWarning
DeprecationWarning
EnvironmentError
EOFError
Exception
FloatingPointError
FutureWarning
GeneratorExit
ImportError
ImportWarning
IndentationError
IndexError
IOError
KeyboardInterrupt
KeyError
LookupError
MemoryError
NameError
NotImplementedError
OSError
OverflowError
PendingDeprecationWarning
ReferenceError
RuntimeError
RuntimeWarning
StandardError
StopIteration
SyntaxError
SyntaxWarning
SystemError
SystemExit
TabError
TypeError
UnboundLocalError
UnicodeDecodeError
UnicodeEncodeError
UnicodeError
UnicodeTranslateError
UnicodeWarning
UserWarning
ValueError
Warning
ZeroDivisionError
更多异常

异常处理

  python解释器检测到错误,触发异常(也允许程序员自己触发异常)。程序员编写特定的代码,专门用来捕捉这个异常(这段代码与程序逻辑无关,与异常处理有关)。如果捕捉成功则进入另外一个处理分支,执行专门为其定制的逻辑,使程序不会崩溃,这就是异常处理

  异常处理是一种用来增强程序的健壮性与容错性的机制

好,下面我们来学习如何进行异常处理

之前我们都是用if条件的形式来规避异常的,如:

#_*_coding:utf-8_*_

num1=input(>>: ) 
if num1.isdigit():
    int(num1) #我们的正统程序放到了这里,其余的都属于异常处理范畴
elif num1.isspace():
    print(您输入的是空格,请输入数字类型)
elif len(num1) == 0:
    print(您输入的是空,请输入数字类型)
else:
    print(其他情情况,请输入数字类型)

‘‘‘
问题一:
使用if的方式我们只为第一段代码加上了异常处理,但这些if,跟你的代码逻辑并无关系,这样你的代码会因为可读性差而不容易被看懂

问题二:
这只是我们代码中的一个小逻辑,如果类似的逻辑多,那么每一次都需要判断这些内容,就会倒置我们的代码特别冗长。

我们可以看出来,虽然用if可以来处理异常,但是从中也暴露出了几个问题:

  问题一:if判断式的异常处理只能针对某一段代码,对于不同的代码段的相同类型的错误你需要写重复的if来进行处理。

  问题二:在程序中频繁的写与程序本身无关,与异常处理有关的if,会使得代码的可读性变差

所以虽然if可以用来处理异常,但会使代码冗余。这里,python提供了专门的异常处理的方法——try

try:
     被检测的代码块
except 异常类型:
     try中一旦检测到异常,就执行这个位置的逻辑

这里用举例说明:

try:
    f = open(a.txt)
    g = (line.strip() for line in f)
    print(next(g))
    print(next(g))
    print(next(g))
    print(next(g))
    print(next(g))
except StopIteration:
    f.close()

‘‘‘
next(g)会触发迭代f,依次next(g)就可以读取文件的一行行内容,无论文件a.txt有多大,同一时刻内存中只有一行内容。
提示:g是基于文件句柄f而存在的,因而只能在next(g)抛出异常StopIteration后才可以执行f.close()
‘‘‘

  异常类只能用来处理指定的异常情况,如果程序产生的异常不是异常类指定的异常,就会报错。所以,我们可以对异常处理进行多分支,最后用一个万能异常处理类Exception来处理你想不到的异常

s1 = hello
try:
    int(s1)
except IndexError as e:#索引异常时执行这里
    print(e)
except KeyError as e:#关键字异常时执行这里
    print(e)
except ValueError as e:#值异常时执行这里
    print(e)
except Exception as e:#万能异常,若出现了与上述指定的异常不同的异常,就走这里
    print(e)

万能异常真的很万能,他可以处理所有异常,但并不是说你凡是遇到异常就用它,那就没别的什么事了。使用时也要分情况:

  1.如果我们想要的效果是,无论出现什么异常,我们统一丢弃,或者使用同一段代码逻辑去处理他们,那么只有一个Exception就足够了。

  2.如果我们想要的效果是,对于不同的异常我们需要定制不同的处理逻辑,那就需要用到多分支了。我们可以在多分支的最后加一个Exception,以防止产生了意料之外的异常后程序崩溃的情形发生。

异常处理中也可以用到else,还有finally,其实这两个可有可无,并不是说非用不可

s1 = hello
try:
    int(s1)
except IndexError as e:
    print(e)
except KeyError as e:
    print(e)
except ValueError as e:
    print(e)
#except Exception as e:
#    print(e)
else:
    print(try内代码块没有异常则执行我)
finally:
    print(无论异常与否,都会执行该模块,通常是进行清理工作)

自定义异常

有时程序员可以自己抛出一个异常,也可以自定义异常

#主动触发异常
try:
    raise TypeError(类型错误)
except Exception as e:
    print(e)


#自定义异常
class EgonException(BaseException):#自定义的异常必须继承BaseException
    def __init__(self,msg):
        self.msg=msg
    def __str__(self):
        return self.msg

try:
    raise EvaException(类型错误)
except EvaException as e:
    print(e)

总而言之

  try..except这种异常处理机制就是取代if那种方式,让程序在不牺牲可读性的前提下增强健壮性和容错性。

  异常处理中为每一个异常定制了异常类型,对于同一种异常,一个except就可以捕捉到,可以同时处理多段代码的异常(无需‘写多个if判断式’)减少了代码,增强了可读性 

 

使用try..except的方式的优点

  1:把错误处理和真正的工作分开来
  2:代码更易组织,更清晰,复杂的工作任务更容易实现;
  3:毫无疑问,更安全了,不至于由于一些小的疏忽而使程序意外崩溃了;

  但是!!!try...except应该尽量少用,因为它本身就是附加给你的程序的一种异常处理的逻辑,与主要的工作是没有关系的,这种东西加的多了,还是会导致代码可读性变差。所以只有在有些异常无法避免的情况下,才应该加上try...except,其他的逻辑错误应该尽量修正。

what's the python之异常处理


推荐阅读
  • 本文介绍了在Windows环境下使用pydoc工具的方法,并详细解释了如何通过命令行和浏览器查看Python内置函数的文档。此外,还提供了关于raw_input和open函数的具体用法和功能说明。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • Vue 2 中解决页面刷新和按钮跳转导致导航栏样式失效的问题
    本文介绍了如何通过配置路由的 meta 字段,确保 Vue 2 项目中的导航栏在页面刷新或内部按钮跳转时,始终保持正确的 active 样式。具体实现方法包括设置路由的 meta 属性,并在 HTML 模板中动态绑定类名。 ... [详细]
  • 本文探讨了如何通过最小生成树(MST)来计算严格次小生成树。在处理过程中,需特别注意所有边权重相等的情况,以避免错误。我们首先构建最小生成树,然后枚举每条非树边,检查其是否能形成更优的次小生成树。 ... [详细]
  • QUIC协议:快速UDP互联网连接
    QUIC(Quick UDP Internet Connections)是谷歌开发的一种旨在提高网络性能和安全性的传输层协议。它基于UDP,并结合了TLS级别的安全性,提供了更高效、更可靠的互联网通信方式。 ... [详细]
  • 如何在WPS Office for Mac中调整Word文档的文字排列方向
    本文将详细介绍如何使用最新版WPS Office for Mac调整Word文档中的文字排列方向。通过这些步骤,用户可以轻松更改文本的水平或垂直排列方式,以满足不同的排版需求。 ... [详细]
  • 理解存储器的层次结构有助于程序员优化程序性能,通过合理安排数据在不同层级的存储位置,提升CPU的数据访问速度。本文详细探讨了静态随机访问存储器(SRAM)和动态随机访问存储器(DRAM)的工作原理及其应用场景,并介绍了存储器模块中的数据存取过程及局部性原理。 ... [详细]
  • 几何画板展示电场线与等势面的交互关系
    几何画板是一款功能强大的物理教学软件,具备丰富的绘图和度量工具。它不仅能够模拟物理实验过程,还能通过定量分析揭示物理现象背后的规律,尤其适用于难以在实际实验中展示的内容。本文将介绍如何使用几何画板演示电场线与等势面之间的关系。 ... [详细]
  • 本文介绍如何通过Windows批处理脚本定期检查并重启Java应用程序,确保其持续稳定运行。脚本每30分钟检查一次,并在需要时重启Java程序。同时,它会将任务结果发送到Redis。 ... [详细]
  • MySQL中枚举类型的所有可能值获取方法
    本文介绍了一种在MySQL数据库中查询枚举(ENUM)类型字段所有可能取值的方法,帮助开发者更好地理解和利用这一数据类型。 ... [详细]
  • 本文介绍如何在应用程序中使用文本输入框创建密码输入框,并通过设置掩码来隐藏用户输入的内容。我们将详细解释代码实现,并提供专业的补充说明。 ... [详细]
  • 本文介绍如何通过SQL查询从JDE(JD Edwards)系统中提取所有字典数据,涵盖关键表的关联和字段选择。具体包括F0004和F0005系列表的数据提取方法。 ... [详细]
  • 本文详细介绍了如何通过命令行启动MySQL服务,包括打开命令提示符窗口、进入MySQL的bin目录、输入正确的连接命令以及注意事项。文中还提供了更多相关命令的资源链接。 ... [详细]
  • 本文介绍如何使用 NSTimer 实现倒计时功能,详细讲解了初始化方法、参数配置以及具体实现步骤。通过示例代码展示如何创建和管理定时器,确保在指定时间间隔内执行特定任务。 ... [详细]
  • MATLAB实现n条线段交点计算
    本文介绍了一种通过逐对比较线段来求解交点的简单算法。此外,还提到了一种基于排序的方法,但该方法较为复杂,尚未完全理解。文中详细描述了如何根据线段端点求交点,并判断交点是否在线段上。 ... [详细]
author-avatar
戴劳力士_484
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有