异常处理

在项目开发中,异常处理是不可或缺的。异常处理帮助人们debug,通过更加丰富的信息,让人们更容易找到bug的所在。异常处理还可以提高程序的容错性。

我们之前在讲循环对象的时候,曾提到一个StopIteration的异常,该异常是在循环对象穷尽所有元素时的报错。

我们以它为例,来说明基本的异常处理。

一个包含异常的程序:

re= iter(range(5))for i in range(100):printre.next()print 'HaHaHaHa'首先,我们定义了一个循环对象re,该循环对象将进行5次循环,每次使用序列的一个元素。

在随后的for循环中,我们手工调用next()函数。当循环进行到第6次的时候,re.next()不会再返回元素,而是抛出(raise)StopIteration的异常。整个程序将会中断。

我们可以修改以上异常程序,直到完美的没有bug。但另一方面,如果我们在写程序的时候,知道这里可能犯错以及可能的犯错类型,我们可以针对该异常类型定义好”应急预案“。

re= iter(range(5))try:for i in range(100):printre.next()exceptStopIteration:print 'here is end',iprint 'HaHaHaHa'在try程序段中,我们放入容易犯错的部分。我们可以跟上except,来说明如果在try部分的语句发生StopIteration时,程序该做的事情。如果没有发生异常,则except部分被跳过。

随后,程序将继续运行,而不是彻底中断。

完整的语法结构如下:try:

...exceptexception1:

...exceptexception2:

...except:

...else:

...finally:

...

如果try中有异常发生时,将执行异常的归属,执行except。异常层层比较,看是否是exception1, exception2...,直到找到其归属,执行相应的except中的语句。如果except后面没有任何参数,那么表示所有的exception都交给这段程序处理。比如:try:print(a*2)exceptTypeError:print("TypeError")except:print("Not Type Error & Error noted")

由于a没有定义,所以是NameError。异常最终被except:部分的程序捕捉。

如果无法将异常交给合适的对象,异常将继续向上层抛出,直到被捕捉或者造成主程序报错。比如下面的程序deftest_func():try:

m= 1/0exceptNameError:print("Catch NameError in the sub-function")try:

test_func()exceptZeroDivisionError:print("Catch error in the main program")

子程序的try...except...结构无法处理相应的除以0的错误,所以错误被抛给上层的主程序。

如果try中没有异常,那么except部分将跳过,执行else中的语句。

finally是无论是否有异常,最后都要做的一些事情。

流程如下,try->异常->except->finally

try->无异常->else->finally抛出异常

我们也可以自己写一个抛出异常的例子:print 'Lalala'

raiseStopIterationprint 'Hahaha'这个例子不具备任何实际意义。只是为了说明raise语句的作用。

StopIteration是一个类。抛出异常时,会自动有一个中间环节,就是生成StopIteration的一个对象。Python实际上抛出的,是这个对象。当然,也可以自行生成对象:raiseStopIteration()

总结try: ... except exception: ... else: ... finally: ...raise exception

try..except

这个用于当异常出现的时候,用except从句来处理异常,而不至于程序自动退出。例如,在python里获取用户输入时,若用户输入文件结束符Ctrl-d,则会引发EOFError文件结束异常。我们使用try except来处理:

#!/usr/bin/python

# Filename: try_except.py

import sys

try:

s = raw_input('Enter something --> ')

except EOFError:

print '\nWhy did you do an EOF on me?'

sys.exit() # exit the program

except:

print '\nSome error/exception occurred.'

# here, we are not exiting the program

print 'Done' 123456789101112131415

我们在运行程序的时候输入Ctrl-d:

$ python try_except.py

Enter something -->

Why did you do an EOF on me?

$ python try_except.py

Enter something --> Python is exceptional!

Done1234567

可以看到,当遇到EOFERROR时,程序执行了except EOFError:中的内容。若出现其他异常,则会执行except:从句中的内容。except后面还可以加else从句,如果没有发生异常,则执行else从句中的内容。记住,首先,我们要导入sys模块!!

try.. catch

catch主要用于异常出现的时候抓取异常,方便显示异常信息。但是我还没有见别人用过,找不到例子~所以是不推荐用嘛?谁找到例子可以留言给我^.^

try.. finally

假如你在读一个文件的时候,希望在无论异常发生与否的情况下都关闭文件,该怎么做呢?这可以使用finally块来完成。注意,在一个try块下,你可以同时使用except从句和finally块。如果你要同时使用它们的话,需要把一个嵌入另外一个。举个例子(还记得文件读写里的poem嘛):

#!/usr/bin/python

# Filename: finally.py

import time

try:

f = file('poem.txt')

while True: # our usual file-reading idiom

line = f.readline()

if len(line) == 0:

break

time.sleep(2)

print line,

finally:

f.close()

print 'Cleaning up...closed the file' 12345678910111213141516

输出:

$ python finally.py

Programming is fun

When the work is done

Cleaning up...closed the file

Traceback (most recent call last):

File "finally.py", line 12, in ?

time.sleep(2)

KeyboardInterrupt 12345678

我们进行通常的读文件工作,但是我有意在每打印一行之前用time.sleep方法暂停2秒钟。这样做的原因是让程序运行得慢一些(Python由于其本质通常运行得很快)。在程序运行的时候,按Ctrl-c中断/取消程序。

我们可以观察到KeyboardInterrupt异常被触发,程序退出。但是在程序退出之前,finally从句仍然被执行,把文件关闭

用raise引发异常

我们可以使用raise语句 引发 异常,但要指明错误/异常的名称和伴随异常 触发的 异常对象。你可以引发的错误或异常应该分别是一个Error或Exception类的直接或间接子类。举个例子:

#!/usr/bin/python

# Filename: raising.py

class ShortInputException(Exception):

'''A user-defined exception class.'''

def __init__(self, length, atleast):

Exception.__init__(self)

self.length = length

self.atleast = atleast

try:

s = raw_input('Enter something --> ')

if len(s) < 3:

raise ShortInputException(len(s), 3)

# Other work can continue as usual here

except EOFError:

print '\nWhy did you do an EOF on me?'

except ShortInputException, x:

print 'ShortInputException: The input was of length %d, \

was expecting at least %d' % (x.length, x.atleast)

else:

print 'No exception was raised.' 12345678910111213141516171819202122

输出:

$ python raising.py

Enter something -->

Why did you do an EOF on me?

$ python raising.py

Enter something --> ab

ShortInputException: The input was of length 2, was expecting at least 3

$ python raising.py

Enter something --> abc

No exception was raised. 1234567891011

这里,我们创建了我们自己的异常类型,其实我们可以使用任何预定义的异常/错误。自己定义的异常类型是ShortInputException类。它有两个域——length是给定输入的长度,atleast则是程序期望的最小长度。

在except从句中,我们提供了错误类和用来表示错误/异常对象的变量。这与函数调用中的形参和实参概念类似。当触发raise从句时,会调用对应的except从句执行,在这个例子中就引发了except ShortInputException,x 这个错误,类似于调用。

---------------------

异常处理

在项目开发中,异常处理是不可或缺的。异常处理帮助人们debug,通过更加丰富的信息,让人们更容易找到bug的所在。异常处理还可以提高程序的容错性。

我们之前在讲循环对象的时候,曾提到一个StopIteration的异常,该异常是在循环对象穷尽所有元素时的报错。

我们以它为例,来说明基本的异常处理。

一个包含异常的程序:

re = iter(range(5))

for i in range(100):

print re.next()

print 'HaHaHaHa'

首先,我们定义了一个循环对象re,该循环对象将进行5次循环,每次使用序列的一个元素。

在随后的for循环中,我们手工调用next()函数。当循环进行到第6次的时候,re.next()不会再返回元素,而是抛出(raise)StopIteration的异常。整个程序将会中断。

我们可以修改以上异常程序,直到完美的没有bug。但另一方面,如果我们在写程序的时候,知道这里可能犯错以及可能的犯错类型,我们可以针对该异常类型定义好”应急预案“。

re = iter(range(5))

try:

for i in range(100):

print re.next()

except StopIteration:

print 'here is end ',i

print 'HaHaHaHa'

在try程序段中,我们放入容易犯错的部分。我们可以跟上except,来说明如果在try部分的语句发生StopIteration时,程序该做的事情。如果没有发生异常,则except部分被跳过。

随后,程序将继续运行,而不是彻底中断。

完整的语法结构如下:

try:

...

except exception1:

...

except exception2:

...

except:

...

else:

...

finally:

...

如果try中有异常发生时,将执行异常的归属,执行except。异常层层比较,看是否是exception1, exception2...,直到找到其归属,执行相应的except中的语句。如果except后面没有任何参数,那么表示所有的exception都交给这段程序处理。比如:

try:

print(a*2)

except TypeError:

print("TypeError")

except:

print("Not Type Error & Error noted")

由于a没有定义,所以是NameError。异常最终被except:部分的程序捕捉。

如果无法将异常交给合适的对象,异常将继续向上层抛出,直到被捕捉或者造成主程序报错。比如下面的程序

[def test_func():

try:

m = 1/0

except NameError:

print("Catch NameError in the sub-function")

try:

test_func()

except ZeroDivisionError:

print("Catch error in the main program")

子程序的try...except...结构无法处理相应的除以0的错误,所以错误被抛给上层的主程序。

如果try中没有异常,那么except部分将跳过,执行else中的语句。

finally是无论是否有异常,最后都要做的一些事情。

流程如下,

try->异常->except->finally

try->无异常->else->finally

抛出异常

我们也可以自己写一个抛出异常的例子:

print 'Lalala'

raise StopIteration

print 'Hahaha'

这个例子不具备任何实际意义。只是为了说明raise语句的作用。

StopIteration是一个类。抛出异常时,会自动有一个中间环节,就是生成StopIteration的一个对象。Python实际上抛出的,是这个对象。当然,也可以自行生成对象:

raise StopIteration()

总结

try: ... except exception: ... else: ... finally: ...

raise exception

作者:龙皓晨

链接:https://www.jianshu.com/p/b4683834ee7f

來源:简书

简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

pythontrycatch所有异常状态_python 一篇搞定所有的异常处理相关推荐

  1. 一篇搞定 SpringBoot+Mybatis+Shiro 实现多角色权限管理

    初衷:我在网上想找整合springboot+mybatis+shiro并且多角色认证的博客,发现找了好久也没有找到想到的,现在自己会了,就打算写个博客分享出去,希望能帮到你. 原创不易,请点赞支持! ...

  2. vlan配置实例详解_网工知识角|MUXVLAN技术详解,基本原理一篇搞定

    学网络,就在IE-LAB 国内高端网络工程师培养基地 MUX VLAN(Multiplex VLAN )提供了一种通过VLAN进行网络资源控制的机制.通过MUX VLAN提供的二层流量隔离的机制可以实 ...

  3. CentOS7搭建LNMP+WordPress一篇搞定

    零.关于本文 本文首次完成于2019年5月12日,经历多次修改.本文所有的参考文献,均以超链接的形式给出.考虑到网上的部分教程不够完整,有的已经过时,我将我搭建环境的方法记录下来. 这篇文章适合: 希 ...

  4. SpringBoot的Web开发支持【超详细【一篇搞定】果断收藏系列】

    SpringBoot的Web开发支持 常用的服务器配置 使用Jetty服务器替换Tomcat 排除Tomcat的启动器,引入Jetty application.yml 编写入口程序 编写Control ...

  5. Linux常用命令大全,一篇搞定

    今日推荐 扔掉 Postman,一个工具全部搞定,真香!为啥查询那么慢?还在直接用JWT做鉴权?JJWT真香推荐 15 款常用开发工具干掉 navicat:这款 DB 管理工具才是y(永)y(远)d( ...

  6. android 仿快递步骤_【干货速递,建议收藏】Android 流式布局,一篇搞定

    今天我们来看Android的流式布局. 所谓流式布局指的是ViewGroup中同一行的宽度不足以容纳下一个子view时,进行换行处理,而不需要考虑子view的大小,每一行的高度以其中最高者为准. Ta ...

  7. 前端做微信好友分享_一篇搞定微信分享和line分享

    前言 在h5的页面开发中,分享是不可或缺的一部分,对于一些传播性比较强的页面,活动页之类的,分享功能极为重要.例如,京东等电商年末时会有一系列的总结h5在微信中传播,就不得不提到微信的分享机制. 微信 ...

  8. 自动化接口测试之Postman(一篇搞定)

    Postman自动化接口测试 该篇文章针对已经掌握 Postman 基本用法的读者,即对接口相关概念有一定了解.已经会使用 Postman 进行模拟请求的操作. 当前环境: Window 7 - 64 ...

  9. 一篇搞定RSA加密与SHA签名|与Java完全同步

    看到这篇文章的同学可幸福了,当时在做RSA加密与签名的时候网上的资料简直不要太老,做完后实在是忍受不下去了,这篇文章我会详细讲解iOS如何实现RSA加密与签名,并且与Java完全同步,这是我的第二篇博 ...

最新文章

  1. html table 筛选记录,JS实现table表格内针对某列内容进行即时搜索筛选功能
  2. VB.NET开发人员必备参考10本书目
  3. 【Vue】ElementUI el-select 下拉分页加载数据,并支持搜索功能(此处不支持分页)
  4. 插入排序法(思路及代码实现)
  5. IsWow64Process 判断操作系统位数
  6. 桌面在计算机领域常用来指,桌面在计算机领域常用来指什么
  7. 循环自相关函数和谱相关密度(二)——实信号、复信号模型下的BPSK信号循环谱推导
  8. 使用KNN时出现非数值属性和缺失值
  9. 霍夫直线检测python_python+opencv实现霍夫变换检测直线
  10. 逆天语言模型GPT-2最新开源:345M预训练模型和1.5B参数都来了
  11. 基于CarMaker的C-NCAP主动安全系统试验仿真(二)
  12. 小米wifi驱动 linux驱动,小米wifi驱动程序
  13. Android 编辑 mhtml,Html Editor下载-Html Editor(Html编辑器)下载v1.0 安卓版-西西软件下载...
  14. 万能遥控器小制作(五)
  15. 什么是黑链?什么是黑帽?什么是明链?
  16. Spring到底是什么
  17. 90个面试问题(带答案)
  18. 我用Excel制作了一枚“电子印章”,太牛逼了!
  19. 仿微信div可编辑ctrl+enter换行,enter发送
  20. Android 屏幕常亮 背景常亮

热门文章

  1. JavaScript特效源码(8、其他特效)
  2. 后端一次性传了10w条数据,前端该如何处理?—— 面试高频
  3. 矢量量化识别孤立字的matlab编码_新zwpython 完胜 老matlab 篇二
  4. 将SkeyeVSS综合安防监控视频流媒体云平台监控画面嵌入微信公众号进行直播
  5. 光通信的最新技术趋势
  6. 高品质USB声卡/音频芯片SSS1700|SSS1700设计96 KHz 24位采样率USB耳机麦克风方案|SSS1700中文设计方案讲解
  7. 前端开发:Vue报错Computed property “show“ was assigned to but it has no setter的解决方法
  8. 跨境电商平台主要有哪些
  9. 9款免费的Windows远程协助软件
  10. 【HDU5984】Pocky(数学)