异常捕获

什么是异常

异常是程序运行时导致错误的bug,会导致程序运行终止。

例如在pycharm中,程序报错会输出一段跟错误相关的报告,并标出出错类型和错误代码位置。

异常的类型

NameError 变量名不存在,调用的名字没有被定义
IndexError 索引值超出范围,索引值超过列表最大长度触发
KeyError 键不存在,当在字典中读取对象时输入不存在的键触发
SyntaxError 符号错误,在代码区使用中文符号等无法识别的字符时触发
TypeError 数据类型错误,输入了不符合类型的字符

异常的类别

语法错误

if True
name

语法层面的错误不允许出现,程序会直接报错

逻辑错误

逻辑错误一般是赋值、输出时写了错误的对象名,导致运行的结果与预期出现差别,程序会允许逻辑错误,但程序员需要检查出来。

异常捕获

当不确定代码是否会出错,或者代码出现错误的位置时,可以使用异常捕获来辅助解决bug。

异常捕获格式

try:可能出错的代码  #代码不会真的执行,只用于模拟监控
except 错误类型1 as e:出现错误1之后执行的代码
except 错误类型2 as e:出现错误2之后执行的代码
except 错误类型3 as e:出现错误3之后执行的代码
......

try下面写的代码只会判断是否出错,根据出错类型执行对应的代码。

错误类型写入内容为NameError等异常的名称,也可以输入万用错误类型。

except Exception as e:  # 万能错误类型1print(e)
except BaseException as e:  # 万能错误类型2print(e)

异常捕获的其他操作

1.else和finally

except Exception as e:print('程序出现错误')
else:print('程序没有错误')
finally:print('监测结束')

else是当程序没有错误时执行对应的子代码

finally是监测部分结束之后执行的代码,无论是否报错都会进行

if......else 除了以上条件外的其他情况下才执行
for/while......else 当循环按照设置好的条件下结束才执行
try......else 当监测程序没有错误时才执行

2.assert()

断言,功能是判断目标的数据类型是否一致,如果和判断的数据类型不一样直接报错

name = 'jason'
assert isinstance(name, list) #变量name的数据类型不是list,直接报错

3.raise()

raise的作用是直接报错,执行时直接生成一段自定义的错误报告

raise Exception('生成一段错误报告')

异常监测在使用时会占据额外的内存,监测的代码部分能简短就简短点。

生成器对象

生成器对象本质就是自定义迭代器对象,使用自定义迭代器可以帮助我们优化代码结构,使代码看上去更加简洁。

关键字yield

yield关键字的作用是,当它出现在函数代码中时,首次调用函数时会把函数本身转换成迭代器对象,不会执行函数其他代码。

def index():print('一段函数代码')yield
res = index()
print(res)

此时打印res得到的结果不是函数index,会显示如下

<generator object index at 0x0000024BAD685BF8>

generator的意思是生成器,经过yield之后函数本身被转换成了一个生成器,也就是自定义迭代器,此时就可以使用__next__来调用迭代器。

yield的特殊功能

用yield中断代码

def index():print('一段函数代码')yield
res = index()
res.__next__()
res.__next__()

连续两次调用自定义迭代器,会显示报错

这是因为yield有特殊功能,就是每一个yeild都会在它当前那一行代码停止,相当于把代码截成多个部分,每个yeild截一部分,每次调用迭代器从对应的yeild执行到下一yeild,而如果yeild下面没有代码,此时调用就会报错。

def index():print('一段函数代码')yieldprint('另一段代码')yieldprint('第三段代码')yield
res = index()
res.__next__()
res.__next__()
res.__next__()

此时就能分段执行函数的三个部分

如果yeild后面有数值或者变量名,也会像return一样返回到函数外。

用yeild接收信息

def index(name,food=None):print(f'{name}准备干午饭!!!')while True:food = yieldprint(f'{name}正在吃{food}')
res = index('jack')
res.__next__()

首次执行函数index时,会在food = yeild处停止,无论yeild在哪个位置,都会执行中断的功能。

def index(name,food=None):print(f'{name}准备干午饭!!!')while True:food = yieldprint(f'{name}正在吃{food}')
res = index('jack')
res.__next__()
res.send('米饭')
res.send('面条')
res.send('炸鸡')

此时最后会按顺序输出jack正在吃XX,因为send()的功能是往迭代器中传值,并自动执行__next__的功能启动迭代器。

生成器表达式

生成器表达式的作用就是使用自定义迭代器快速生成自己需要的功能,用于节约代码。

l1 = [i**2 for i in range(10) if i > 3]
print(l1)

该代码的效果为,变量i从范围0到10循环+1,当i>3时,输出i的二次方并输入到列表l1中。

生成器的作用就是压缩代码空间,并且像函数一样,在需要的时候调用。

异常捕获与自定义迭代器相关推荐

  1. python 跳过迭代_Python迭代和解析(4):自定义迭代器

    Python迭代和解析(4):自定义迭代器 发布时间:2019-01-13 17:10, 浏览次数:280 , 标签: Python 解析.迭代和生成系列文章:https://www.cnblogs. ...

  2. 捕获异常_SpringBoot的异常处理全局异常捕获(图文资料)

    目标:springboot全局异常捕获 概述 1.自定义异常处理 package com.itheima.exeception; /** * @Author David老师 * @Descriptio ...

  3. Python基础教程:自定义迭代器

    本文介绍如何自定义迭代器,涉及到类的运算符重载,包括__getitem__的索引迭代,以及__iter__.__next__和__contains__,如果不了解这些知识可跳过本文. 索引迭代方式 索 ...

  4. PHP的异常处理异常捕获错误类

    1.错误分类 Fatal Error:致命错误(脚本终止运行)E_ERROR // 致命的运行错误,错误无法恢复,暂停执行脚本E_CORE_ERROR // PHP启动时初始化过程中的致命错误E_CO ...

  5. 《SpringBoot从菜鸟到老鸟》之SpringBoot 如何配置全局的异常捕获

    SpringBoot 如何配置全局的异常捕获 SpringBoot中自带的异常捕获机制返回的默认页面比较丑,对用户来说不够人性化. 所以这篇文章来讲解SpringBoot钟自定义全局异常捕获. 主要讲 ...

  6. ssm异常捕获和处理

    ssm异常捕获和处理 package exception;import lombok.extern.slf4j.Slf4j; import org.hibernate.HibernateExcepti ...

  7. 技术实践第二期|Flutter异常捕获

    简介:应用性能稳定是良好用户体验中非常关键的一环,为了更好保障应用性能稳定,异常捕获在保证线上产品稳定中扮演着至关重要的角色.我们团队在推出了U-APM移动应用性能监控的产品后,帮助开发者定位并解决掉 ...

  8. Java 捕获 mybatis异常_3 springboot集成mybatis和全局异常捕获

    mybatis有两种方式,一种是基于XML,一种是基于注解 springboot集成mybatis 首先先创建表,这里都简化了 DROP TABLE IF EXISTS `user`; CREATE ...

  9. springboot怎么返回404_深度分析:SpringBoot异常捕获与封装处理,看完你学会了吗?...

    简介 日常开发过程中,难免有的程序会因为某些原因抛出异常,而这些异常一般都是利用try ,catch的方式处理异常或者throw,throws的方式抛出异常不管.这种方法对于程序员来说处理也比较麻烦, ...

最新文章

  1. memset函数使用详解
  2. 我们讲得比开复专业一点,是《奇葩大会》的李开复
  3. java压缩----使用ANT JDK压缩---只压缩选中目录的指定文件夹
  4. USACO 2.1 海明码 Hamming Codes (模拟+位运算+黑科技__builtin_popcount(n))
  5. 启动tomcat时 一闪而过解决方法
  6. java反射三种方法_Java基础入门要学哪些 怎么掌握反射和枚举
  7. PCB设计之:必知的PCB设计八大误区
  8. IP 层收发报文简要剖析1-ip报文的输入
  9. h5文字垂直居中_PS教程:巧用自由变换,制作折纸文字效果
  10. make指定输出目录
  11. visio防火墙可以连接什么_分享一款网工必备网络拓扑图绘制工具Visio以及大量厂商图标库...
  12. 广东南方地形地籍成图软件CASS10.1十大新亮点(资源下载在文尾)
  13. 腾讯视频QLV格式转换为MP4格式
  14. 每日一诗词 —— 访戴天山道士不遇
  15. maven学习系列8----将resources目录下的文件打包到jar包外
  16. 排序算法(分类,时间复杂度)(快速排序,插入排序,希尔排序,选择排序,冒泡排序)
  17. db2 improt from coldel0x7c
  18. 2020.07 学习日记
  19. 7位专家– 7条意见:Java 13的亮点是什么?
  20. cad画图要求计算机最低配置,AutoCAD电脑配置要求:AutoCAD LT 2022 系统要求

热门文章

  1. NLPCC2021.10.14
  2. 【python】自动登录51cto家园
  3. Office快捷键大全之二(Excel快捷键)
  4. AD20笔记-元器件绘制
  5. Nape刚体body.align();
  6. 戴尔游匣7559更换C面和D面以及升级内存硬盘教程
  7. 操作OMF(Oracle Managed Files,Oracle管理的文件)
  8. Mac下的Adobe卸载后无法重装
  9. 零基础入门CV之街道字符识别----Task1赛题的理解
  10. xUtils图片本地缓存使用