详解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中字符串前面加r的作用
Jun 04 Python
你所不知道的Python奇技淫巧13招【实用】
Dec 14 Python
python实现csv格式文件转为asc格式文件的方法
Mar 23 Python
python机器学习之KNN分类算法
Aug 29 Python
Python实现的对一个数进行因式分解操作示例
Jun 27 Python
使用Python自动生成HTML的方法示例
Aug 06 Python
多版本python的pip 升级后, pip2 pip3 与python版本失配解决方法
Sep 11 Python
3种适用于Python的疯狂秘密武器及原因解析
Apr 29 Python
Python实现一个简单的毕业生信息管理系统的示例代码
Jun 08 Python
python如何输出反斜杠
Jun 18 Python
 分享一个Python 遇到数据库超好用的模块
Apr 06 Python
Python之matplotlib绘制饼图
Apr 13 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中extract()函数的定义和用法
2012/08/17 PHP
php5.3中连接sqlserver2000的两种方法(com与ODBC)
2012/12/29 PHP
网站页面自动跳转实现方法PHP、JSP(下)
2010/08/01 Javascript
使用Grunt.js管理你项目的应用说明
2013/04/24 Javascript
JS正则表达式大全(整理详细且实用)
2013/11/14 Javascript
JS替换文本域内的回车示例
2014/02/18 Javascript
使用js实现一个可编辑的select下拉列表
2014/02/20 Javascript
javascript根据时间生成m位随机数最大13位
2014/10/30 Javascript
javascript变量声明实例分析
2015/04/25 Javascript
javascript中window.open在原来的窗口中打开新的窗口(不同名)
2015/11/15 Javascript
vue,angular,avalon这三种MVVM框架优缺点
2016/04/27 Javascript
javascript实现不同颜色Tab标签切换效果
2016/04/27 Javascript
深入解析JavaScript中的立即执行函数
2016/05/21 Javascript
AngularJS 与百度地图的结合实例
2016/10/20 Javascript
利用jQuery解析获取JSON数据
2017/04/08 jQuery
vue监听滚动事件实现滚动监听
2017/04/11 Javascript
详谈ES6中的迭代器(Iterator)和生成器(Generator)
2017/07/31 Javascript
详解webpack-dev-server使用http-proxy解决跨域问题
2018/01/13 Javascript
vue.js做一个简单的编辑菜谱功能
2018/05/08 Javascript
vue-router路由模式详解(小结)
2019/08/26 Javascript
Cordova(ionic)项目实现双击返回键退出应用
2019/09/17 Javascript
extjs图形绘制之饼图实现方法分析
2020/03/06 Javascript
[05:36]DOTA2 2015国际邀请赛中国区预选赛第四日TOP10
2015/05/29 DOTA
简单掌握Python中glob模块查找文件路径的用法
2016/07/05 Python
浅谈python中的变量默认是什么类型
2016/09/11 Python
Python使用xlwt模块操作Excel的方法详解
2018/03/27 Python
浅析python3中的os.path.dirname(__file__)的使用
2018/08/30 Python
pycharm中显示CSS提示的知识点总结
2019/07/29 Python
解决python 在for循环并且pop数组的时候会跳过某些元素的问题
2020/12/11 Python
Weekendesk意大利:探索多种引人入胜的周末主题
2016/10/14 全球购物
六月份红领巾广播稿
2014/02/03 职场文书
表决心的诗句大全
2014/03/11 职场文书
学校庆元旦歌咏比赛主持词
2014/03/18 职场文书
党员个人对照检查材料思想汇报
2014/09/16 职场文书
调解书格式范本
2015/05/20 职场文书
Java代码规范与质量检测插件SonarLint的使用
2022/08/05 Java/Android