MyPython--进阶篇--异常
Python使用被称为对象的特殊对象来管理程序执行期间发生的错误。每当发生让pthon不知所措的错误时,他都会创建一个异常对象。如果你编写了处理该异常的代码,程序将继续运行,否则程序将停止并显示一个traceback,其中包含有关异常的报告。
异常是使用try-except代码块来处理的。代码块让python执行指定的操作,同时告诉python发生异常时怎么办。
处理ZeroDivisionError异常
将一个数字除以零
print(1/0) #报以下错误 Traceback (most recent call last):File "D:/pythontest/pycharmt/day9/pitest.py", line 41, in <module>print(1/0) ZeroDivisionError: division by zero
这种情况下python停止运行并告诉你引发了哪种异常,ZerDivisionError错误是一个异常对象。我们可以增加代码防止这种情况
try:print(1/0) except ZeroDivisionError:print('no zero')
使用try-except代码块来处理可能触发的异常。将可能出错的代码放到try内,在except中放入出错后希望运行的代码。如果没有出错,就跳过except代码中的内容
else 代码块
通过将可能会引发错误的代码放到代码块tr-except中,可提高这个程序抵御错误的能力。有赖于try代码成功执行的代码都应该放到else里
while 1:num_1 = input('enter first num ')num_2 = input('enter second num')try:print(int(num_1)/int(num_2))except ZeroDivisionError:print('no zero ')else:answer = int(num_1)/int(num_2)
将可能引发错误的代码放入try中,将对触发错误代码后执行的放到except中,将try代码执行成功后要执行的放在else代码块中
通过预测可能发生错误的代码,可编写健壮的程序,他们即便面临无效数据或缺少资源,也能继续运行,从而能抵御无意的用户错误和恶意的攻击
处理FileNotFoundError异常
来读取一个不存在的文件
with open('cc.txt') as file_object:file_txt = file_object.read() Traceback (most recent call last):File "D:/python/pycharmtest/day12/filetest.py", line 15, in <module>with open('cc.txt') as file_object: FileNotFoundError: [Errno 2] No such file or directory: 'cc.txt
python找不到要打开的文件,于是创建了FileNotFoundError对相关,这个错误时open产生的
ry:with open('cc.txt') as file_object:file_txt = file_object.read() except FileNotFoundError:print('file not found')
分析文本
with open('blog.txt')as file_object: # cont = '' # try: # contents = file_object.read() # for x in contents: # x = ''.join(x.split(' ')) # cont += x.strip() # except UnicodeDecodeError: # print('编码错误') # print(cont) # print(len(cont))
使用多个文件
def file_count(file_name):try:with open(file_name) as file_object:contents = file_object.read()except FileNotFoundError:print('%s is not found'%file_name)else:content = ''.join(contents.split())print('%s count %s'%(file_name,len(content))) file_name = ['blog.txt','pi.txt','cc.txt'] for x in file_name:file_count(x)
输出
blog.txt count 20
pi.txt count 1197
cc.txt is not found
失败时一声不吭
try:with open('no.txt') as file_object:contents = file_object.read() except FileNotFoundError:pass else:print(len(contents.split()))
在找不到文件时pass什么都不做,pass也充当一个占位符的作用
ValueError
while 1:num_1 = input('enter frist num')num_2 = input('enter second num')try:answer = int(num_1)/int(num_2)except ValueError:print('no chr')else:answer = int(num_1)/int(num_2)print(answer)
记录错误
如果不捕获错误,自然还可以让python解释器来打印处错误堆栈,但程序也被结束了。既然我们能捕获错误,就可以把错误堆栈打印出来,然后分析错误原因,同时让程序继续执行下去
python内置的logging 模块可以非常容易地记录错误信息:
import loggingdef bar1(n):return 10/n def bar2(n):return bar1(n)*2 def main():try:bar2(0)except Exception as e:logging.exception(e) main() print('end')
同样出错,但程序打印完错误信息后会继续执行,并正常退出
ERROR:root:division by zero end Traceback (most recent call last):File "D:/pythontest/pycharmt/senior/errortest.py", line 9, in mainbar2(0)File "D:/pythontest/pycharmt/senior/errortest.py", line 6, in bar2return bar1(n)*2File "D:/pythontest/pycharmt/senior/errortest.py", line 4, in bar1return 10/n ZeroDivisionError: division by zero
抛出错误
因为错误是class,捕获一个错误就是捕获到该class的一个实例。因此,错误并不是凭空产生的,而是有意创建并抛出的。python的内置函数会抛出很多类型的错误,我们自己编写的函数也可以
如果要抛出错误,首先要根据需要,定义一个错误的lclass,选择好继承关系,然后用raise语句抛出一个错误的实例
class FooError(ValueError):'''错误的类,选择继承关系'''pass def foo(s):if s ==0:raise FooError('invalid value : %s' % s)#抛出return 10/s foo(0)
执行后,我们最后跟踪对自己定义的错误
Traceback (most recent call last):File "D:/pythontest/pycharmt/senior/errortest.py", line 20, in <module>foo(0)File "D:/pythontest/pycharmt/senior/errortest.py", line 18, in fooraise FooError('invalid value : %s' % s) __main__.FooError: invalid value : 0
只有必要的时候才定义我们自己的错误类型,如果可以你选择python已有的内置的错误类型(比如ValueError,TypeError),尽量使用python内置的错误类型
决不能把一个IOError转换成毫不相干的ValueError
在文档中写清楚可能会抛出那些错误,依旧错误产生的原因
调试
再议logging
把print()替换为logging是检查错误的第三章方式,和assert比,logging不会抛出错误,而且可以输出到文件
转载于:https://www.cnblogs.com/notJoke/p/5831854.html
MyPython--进阶篇--异常相关推荐
- Enterprise Library Step By Step系列(十二):异常处理应用程序块——进阶篇
一.把异常信息Logging到数据库 在日志和监测应用程序块中,有朋友提意见说希望能够把异常信息Logging到数据库中,在这里介绍一下具体的实现方法. 1.创建相关的数据库环境: 我们可以用日志和监 ...
- Kafka核心设计与实践原理总结:进阶篇
作者:未完成交响曲,资深Java工程师!目前在某一线互联网公司任职,架构师社区合伙人! kafka作为当前热门的分布式消息队列,具有高性能.持久化.多副本备份.横向扩展能力.我学习了<深入理解K ...
- 计算机编程书籍-笨办法学Python 3:基础篇+进阶篇
编辑推荐: 适读人群 :本书适合所有已经开始使用Python的技术人员,包括初级开发人员和已经升级到Python 3.6版本以上的经验丰富的Python程序员. "笨办法学"系列, ...
- 笔记本蓝牙显示输入码无效_小白笔记本连接蓝牙设备进阶篇
小白笔记本连接蓝牙设备进阶篇 小白笔记本连接蓝牙,打开电脑蓝牙搜索外接蓝牙设备譬如耳机一般就能搜索到进行匹配即可.当然也会遇到怎么搜都搜不到,是不是瞬间有了想砸掉电脑的冲动,有木有,有木有...... ...
- OpenCV进阶篇视频
OpenCV进阶篇01 第14章 视频处理 OpenCV不仅能够处理图像,还能够处理视频.视频是由大量的图像构成的,这些图像以固定的时间间隔从视频中获取.这样,就能够使用图像处理的方法对这些图像进行处 ...
- java中怎样导入图片6_java程序员进阶篇之必须掌握的6张思维导图!
原标题:java程序员进阶篇之必须掌握的6张思维导图! <java程序员的自我修养>的作者是MindMaster思维导图社区用户芒果,作者整理了一系列学习java程序的笔记,方便java程 ...
- python如何进阶提升_Python序列操作之进阶篇
简介 Python 的序列(sequence)通常指一个可迭代的容器,容器中可以存放任意类型的元素.列表和元组这两种数据类型是最常被用到的序列,python内建序列有六种,除了刚刚有说过的两种类型之外 ...
- 零基础写Java知乎爬虫之进阶篇
转载自 零基础写Java知乎爬虫之进阶篇 前面几篇文章,我们都是简单的实现了java爬虫抓取内容的问题,那么如果遇到复杂情况,我们还能继续那么做吗?答案当然是否定的,之前的仅仅是入门篇,都是些基础知识 ...
- python初级进阶篇
python之路:进阶篇 一.作用域 在Python 2.0及之前的版本中,Python只支持3种作用域,即局部作用域,全局作用域,内置作用域:在Python 2.2中,Python正式引入了一种新的 ...
- Android日志[进阶篇]五-阅读错误报告
Android日志[进阶篇]一-使用 Logcat 写入和查看日志 Android日志[进阶篇]二-分析堆栈轨迹(调试和外部堆栈) Android日志[进阶篇]三-Logcat命令行工具 Androi ...
最新文章
- C++中的静态绑定与动态绑定
- 开发日记-20190519 关键词 Linux学习路径
- bzoj 3680 吊打xxx
- linux curl 多线程,CURL多线程不执行一直在请求
- 蓝桥杯单片机基础学习00_2
- 信息学奥赛一本通 2043:【例5.11】杨辉三角形
- 回溯法——批处理作业调度
- getssdtserviceid_[下载]发个获得SSDT函数名和索引号的代码
- vofuria的开发(3)将vuforia引入新建立的工程
- python sdklive2d_纯干货!live2d动画制作简述以及踩坑
- 医疗系统流程软件测试用例,医疗管理系统案例测试用例.doc
- linux中的代码比对工具meld
- 电脑爱好者 2008年第24期 12月下
- 王献之碧玉小楷《洛神赋十三行》王献之小楷高清原石拓本对比图
- 交互式机器学习/ 强化学习在图像领域中的应用
- printf的计算和输出顺序
- 对于自定义element 弹出框 文字提示样式
- python需要购买版权吗_关于版权事宜的一些说明
- 移动软件开发-高校新闻网
- 马少平、周枫、王小川、楼天城、唐文斌……清华计算机系与AI的40年