python | 控制流语句(三)
时间:2019-12-26
本文章向大家介绍python | 控制流语句(三),主要包括python | 控制流语句(三)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
第1节 异常处理机制
1.1 异常和错误
异常和错误都能引起程序执行错误而退出,它们属于程序没有考虑到的例外情况,但两种有很大区别:
- 异常:可以预见的例外情况。如除数为0、类型不对、打开的文件不存在 —— 可以预见
- 错误:编码逻辑产生的不可预见的情况。如列表只有6个元素,程序去索引第7个 —— 不可预见
1.2 异常解读
解读异常提示信息,能帮助快速发现问题和定位出错代码位置,下面是一个异常解读演示:
其中最重要的是「异常类型」,它表明异常发生原因,也是处理异常的依据。
1.3 常见异常
python中异常有很多种,但经常会遇到的不多,一般只需要掌握如下几种即可:
异常类型 | 注释 |
---|---|
SyntaxError | 语法错误 |
NameError | 访问变量未声明 |
ZeroDivisionError | 除数为 0 |
ValueError | 传入参数无效 |
TypeError | 类型错误(对类型的操作无效) |
AttributeError | 对象没有这个属性 |
IndexError | 序列中没有此索引 |
KeyError | 映射中没有这个键 |
IndentationError | 缩进错误 |
1.4 异常捕获和处理
可以使用try-except
语句,来捕获处理python中出现的异常,其使用语法如下:
程序优先执行try子句,若无异常则忽略except子句直接结束;若产生异常且与except设置的异常名称一致,则执行except子句;若有多层嵌套且异常与任何的excep都不匹配,则异常将会传递给上层的 try 。
注意:
- 一个 try 语句可能包含多个except子句,分别来处理不同的特定的异常,但最多只有一个分支会被执行
- 一个except子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组
try-except
捕获处理机制不能滥用,否则代码可读性会降低
常见的有这几种应用场景:用户输入合规性、打开文件是否成功、爬虫向服务器发起请求。
# 异常处理机制
try:
num = eval(input("请输入一个数字:"))
print(num*2)
except NameError: # 指定异常类型为NameError
print("输入错误,请输入一个数字!")
except: # 没指定任何类型,表示对应的语句块可以处理所有其他异常
print("其他错误")
若想要程序一直执行,直到满足条件为止,可以巧用死循环 + 异常。
# 若想要一直执行,直到满足条件为止:用死循环
while 1:
try:
num = eval(input("请输入一个数字:"))
print(num*2)
break # 跳出死循环
except NameError: # 指定异常类型为NameError
print("输入错误,请输入一个数字!")
except: # 没指定任何类型,表示对应的语句块可以处理所有其他异常
print("其他错误")
更多可参看:https://www.runoob.com/python3/python3-errors-execptions.html
1.5 else拓展
try-except
语句还有一个可选的else子句,如果使用这个子句,那么必须放在所有的except子句之后。
和for循环、while循环中的else一样,try-except
中的else子句将在try子句没有发生任何异常时才执行。
for arg in sys.argv[1:]:
try:
f = open(arg, 'r')
except IOError:
print('cannot open', arg)
else:
print(arg, 'has', len(f.readlines()), 'lines')
f.close()
原文地址:https://www.cnblogs.com/1k-yang/p/12102181.html
- Selenium3+Python3环境部署
- Java Mail(三):Session、Message详解
- .NET Core采用的全新配置系统[8]: 如何实现配置与源文件的同步
- 四个问答让你秒懂区块链原理及应用
- .NET Core采用的全新配置系统[9]: 为什么针对XML的支持不够好?如何改进?
- 【机器学习实战】第11章 使用 Apriori 算法进行关联分析
- 【Scikit-Learn 中文文档】概率校准 - 监督学习 - 用户指南 | ApacheCN
- ASP.NET MVC路由扩展:链接和URL的生成
- .NET Core采用的全新配置系统[10]: 配置的同步机制是如何实现的?
- C+实现神经网络之贰—前向传播和反向传播
- 通过重建Hosting系统理解HTTP请求在ASP.NET Core管道中的处理流程[上]:采用管道处理请求
- 2017奇葩机器人大盘点:一言不合让你变瞎
- 【机器学习实战】第14章 利用SVD简化数据
- 异步数据存储声明
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 一文搞懂 java -jar 发生了什么
- 树莓派4裸机基础教程:环境搭建
- Oh! Binlog还能这样用之Canal篇
- docker安装elasticsearch和head插件
- redis学习(十六)
- 商业鬼才教你 策略模式
- 为什么StringBuilder是线程不安全的?
- (四)Hive分区、分桶
- Redis的各种数据类型实践-Set
- 快速学习-RocketMQ权限控制
- 快速学习-RocketMQ DefaultMQProducer
- 快速学习-Jenkins CLI自动补全
- 快速学习-Jenkins CLI计算节点
- mybatis的分页查询
- Cypress系列(50)- wrap() 命令详解