详解python中的异常捕获


Posted in Python onDecember 15, 2020

异常

异常是程序发生错误的信号,程序一旦出错就会抛出异常,程序的运行随之终止。

# 异常处理的三个特征
- 异常的追踪信息
- 异常的类型
- 异常的内容

捕获异常的目的:为了增强程序的健壮性,即便程序运行过程中出错,也不要终止程序,而是捕获异常并处理,将出错信息记录到日志内。

# 语法上错误SyntaxError
- 处理方式1:必须在程序运行前就改正

# 逻辑上的错误
- 错误发生的条件是可以预知的 --> if判断
- 错误发生的条件是无法预知的 --> 异常捕获 try

本来程序一旦出现异常就整体结束掉了,有了异常处理以后,在被检测的代码块出现异常时,被检测的代码块中异常发生位置之后的代码将不会执行,取而代之的是执行匹配异常的except子代码块,其余代码均正常运行。

异常捕获

当被检测的代码块中有可能触发不同类型的异常时,针对不同类型的异常:

如果我们想分别用不同的逻辑处理,需要用到多分支的except(类似于多分支的elif,从上到下依次匹配,匹配成功一次便不再匹配其他)

try:
  # 有可能会抛出异常的代码
  子代码1
  子代码2
  子代码3
except 异常类型1 as e:	# as语法将异常类型的值赋值给变量e,这样我们通过打印e便可以知道错误的原因
  pass
except 异常类型2 as e:
  pass
...
else:
  如果被检测的子代码块没有异常发生,则会执行else的子代码
finally:
  无论被检测的子代码块有无异常发生,都会执行finally的子代码

  
# try不能和else单独连用
# try 和 finally 连用,就算出了异常也先执行finally下代码块再抛出异常

如果我们想多种类型的异常统一用一种逻辑处理,可以将多个异常放到一个元组内,用一个except匹配。

try:
  被检测的代码块
except (NameError,IndexError,TypeError):
  触发NameError或IndexError或TypeError时对应的处理逻辑

如果我们想捕获所有异常并用一种逻辑处理,Python提供了一个万能异常类型 Exception

try:
  被检测的代码块
except NameError:
  触发NameError时对应的处理逻辑
except IndexError:
  触发IndexError时对应的处理逻辑
except Exception:
  其他类型的异常统一用此处的逻辑处理

在不符合Python解释器的语法或逻辑规则时,是由Python解释器主动触发的各种类型的异常,而对于违反程序员自定制的各类规则,则需要由程序员自己来明确地触发异常,这就用到了raise语句,raise后必须是一个异常的类或者是异常的实例

class Student:
  def __init__(self,name,age):
    if not isinstance(name,str):
      raise TypeError('name must be str')
    if not isinstance(age,int):
      raise TypeError('age must be int')

    self.name=name
    self.age=age

stu1=Student(4573,18) # TypeError: name must be str
stu2=Student('egon','18') # TypeError: age must be int

在内置异常不够用的情况下,我们可以通过继承内置的异常类来自定义异常类

class PoolEmptyError(Exception): # 可以通过继承Exception来定义一个全新的异常
  def __init__(self,value='The proxy source is exhausted'): # 可以定制初始化方法
    super(PoolEmptyError,self).__init__()
    self.value=value

  def __str__(self): # 可以定义该方法用来定制触发异常时打印异常值的格式
    return '< %s >' %self.value


class NetworkIOError(IOError): # 也可以在特定异常的基础上扩展一个相关的异常
  pass


raise PoolEmptyError # __main__.PoolEmptyError: < The proxy source is exhausted >
raise NetworkIOError('连接被拒绝') # __main__.NetworkIOError: 连接被拒绝

最后,Python还提供了一个断言语句assert expression,断定表达式expression成立,否则触发异常AssertionError,与raise-if-not的语义相同,如下

age='18'

# 若表达式isinstance(age,int)返回值为False则触发异常AssertionError
assert isinstance(age,int)

# 等同于
if not isinstance(age,int):
  raise AssertionError

在了解了异常处理机制后,本着提高程序容错性和可靠性的目的,读者可能会错误地认为应该尽可能多地为程序加上try...except...,这其是在过度消费程序的可读性,因为try...except本来就是你附加给程序的一种额外的逻辑,与你的主要工作是没有多大关系的。所以不要随便使用异常捕获,只用当当异常发生时不可预知时,或万不得已时才使用异常捕获。

以上就是详解python中的异常捕获的详细内容,更多关于python 异常捕获的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python实现基本线性数据结构
Aug 22 Python
Python实现解析Bit Torrent种子文件内容的方法
Aug 29 Python
Python+OpenCV实现车牌字符分割和识别
Mar 31 Python
Python文件读写保存操作的示例代码
Sep 14 Python
postman传递当前时间戳实例详解
Sep 14 Python
Python中关于浮点数的冷知识
Sep 22 Python
python爬虫模拟浏览器访问-User-Agent过程解析
Dec 28 Python
对tensorflow中的strides参数使用详解
Jan 04 Python
python文件和文件夹复制函数
Feb 07 Python
Python基于Dlib的人脸识别系统的实现
Feb 26 Python
详解pandas中利用DataFrame对象的.loc[]、.iloc[]方法抽取数据
Dec 13 Python
pytorch MSELoss计算平均的实现方法
May 12 Python
python 6种方法实现单例模式
Dec 15 #Python
Ubuntu16安装Python3.9的实现步骤
Dec 15 #Python
Python爬虫开发与项目实战
Dec 16 #Python
python中reload重载实例用法
Dec 15 #Python
python 实现socket服务端并发的四种方式
Dec 14 #Python
linux centos 7.x 安装 python3.x 替换 python2.x的过程解析
Dec 14 #Python
Python获取指定网段正在使用的IP
Dec 14 #Python
You might like
PHP正则替换函数preg_replace和preg_replace_callback使用总结
2014/09/22 PHP
smarty中js的调用方法示例
2014/10/27 PHP
Yii2中OAuth扩展及QQ互联登录实现方法
2016/05/16 PHP
PHP 7.4 新语法之箭头函数实例详解
2019/05/09 PHP
PHP设计模式(一)工厂模式Factory实例详解【创建型】
2020/05/02 PHP
理解Javascript_06_理解对象的创建过程
2010/10/15 Javascript
node.js正则表达式获取网页中所有链接的代码实例
2014/06/03 Javascript
Bootstrap每天必学之基础排版
2015/11/20 Javascript
jQuery EasyUI datagrid在翻页以后仍能记录被选中行的实现代码
2016/08/15 Javascript
Vue下滚动到页面底部无限加载数据的示例代码
2018/04/22 Javascript
JS实现的点击按钮图片上下滚动效果示例
2019/01/28 Javascript
基于vue-cli、elementUI的Vue超简单入门小例子(推荐)
2019/04/17 Javascript
python 动态获取当前运行的类名和函数名的方法
2014/04/15 Python
python实现的简单FTP上传下载文件实例
2015/06/30 Python
小白入门篇使用Python搭建点击率预估模型
2018/10/12 Python
python 删除字符串中连续多个空格并保留一个的方法
2018/12/22 Python
django中使用Celery 布式任务队列过程详解
2019/07/29 Python
浅谈django channels 路由误导
2020/05/28 Python
Python自动化操作实现图例绘制
2020/07/09 Python
Django 权限管理(permissions)与用户组(group)详解
2020/11/30 Python
10分钟入门CSS3 Animation
2018/12/25 HTML / CSS
美国宠物商店:Wag.com
2016/10/25 全球购物
澳大利亚相机之家:Camera House
2017/11/30 全球购物
Swisse官方海外旗舰店:澳大利亚销量领先,自然健康品牌
2017/12/15 全球购物
英国户外服装品牌:Craghoppers
2019/04/25 全球购物
会计专业自我鉴定范文
2013/10/06 职场文书
汽车维修专业毕业生的求职信分享
2013/12/04 职场文书
岗位职责风险防控
2014/02/18 职场文书
文秘大学生求职信
2014/02/25 职场文书
信息总监管理职责范本
2014/03/08 职场文书
甲乙双方合作协议书
2014/10/13 职场文书
《认识年月日》教学反思
2016/02/19 职场文书
导游词之山东八仙过海景区
2019/11/11 职场文书
python文本处理的方案(结巴分词并去除符号)
2021/05/26 Python
Python爬虫网络请求之代理服务器和动态Cookies
2022/04/12 Python
vue+elementUI实现表格列的显示与隐藏
2022/04/13 Vue.js