python编程进阶之异常处理用法实例分析


Posted in Python onFebruary 21, 2020

本文实例讲述了python异常处理用法。分享给大家供大家参考,具体如下:

之前用Java的时候,在容易出错的地方我们经常使用try…catch或者try…catch…finally来捕捉和显示异常,在python中很高兴地发现它也有这样的机制。

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'

我们在运行程序的时候输入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!
Done

可以看到,当遇到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'

输出:

$ 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

我们进行通常的读文件工作,但是我有意在每打印一行之前用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.'

输出:

$ 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.

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

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

更多Python相关内容感兴趣的读者可查看本站专题:《Python入门与进阶经典教程》、《Python字符串操作技巧汇总》、《Python列表(list)操作技巧总结》、《Python编码操作技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python下的常用下载安装工具pip的安装方法
Nov 13 Python
Python爬虫代理IP池实现方法
Jan 05 Python
python调用OpenCV实现人脸识别功能
May 25 Python
Python装饰器模式定义与用法分析
Aug 06 Python
Python线程下使用锁的技巧分享
Sep 13 Python
Python3中的最大整数和最大浮点数实例
Jul 09 Python
使用python批量修改文件名的方法(视频合并时)
Mar 24 Python
python实现超级马里奥
Mar 18 Python
Python稀疏矩阵及参数保存代码实现
Apr 18 Python
详解python中的闭包
Sep 07 Python
Python QT组件库qtwidgets的使用
Nov 02 Python
Python中的matplotlib绘制百分比堆叠柱状图,并为每一个类别设置不同的填充图案
Apr 20 Python
python编程进阶之类和对象用法实例分析
Feb 21 #Python
Python面向对象中类(class)的简单理解与用法分析
Feb 21 #Python
Python利用 utf-8-sig 编码格式解决写入 csv 文件乱码问题
Feb 21 #Python
python读写文件write和flush的实现方式
Feb 21 #Python
浅谈python print(xx, flush = True) 全网最清晰的解释
Feb 21 #Python
浅谈python中频繁的print到底能浪费多长时间
Feb 21 #Python
python使用Geany编辑器配置方法
Feb 21 #Python
You might like
数组任意位置插入元素,删除特定元素的实例
2017/03/02 PHP
如何在Laravel5.8中正确地应用Repository设计模式
2019/11/26 PHP
PhpStorm2020 + phpstudyV8 +XDebug的教程详解
2020/09/17 PHP
用Laravel轻松处理千万级数据的方法实现
2020/12/25 PHP
js 判断浏览器类型 去全角、半角空格 自动关闭当前窗口
2009/04/10 Javascript
js 事件处理函数间的Event物件是否全等
2011/04/08 Javascript
jquery实现的让超出显示范围外的导航自动固定屏幕最顶上
2011/09/22 Javascript
JS函数实现动态添加CSS样式表文件
2012/12/15 Javascript
基于javascript 闭包基础分享
2013/07/10 Javascript
再分享70+免费的jquery 图片滑块效果插件和教程
2014/12/15 Javascript
Java中Timer的用法详解
2015/10/21 Javascript
基于 webpack2 实现的多入口项目脚手架详解
2017/06/26 Javascript
vue项目中api接口管理总结
2018/04/20 Javascript
浅谈webpack 构建性能优化策略小结
2018/06/13 Javascript
关于NodeJS中的循环引用详解
2019/07/23 NodeJs
[03:31]DOTA2英雄基础教程 大地之灵
2013/12/17 DOTA
[56:47]Ti4 循环赛第三日 iG vs Liquid
2014/07/12 DOTA
[04:48]DOTA2亚洲邀请赛林书豪为VGJ加油
2017/04/01 DOTA
Python新手在作用域方面经常容易碰到的问题
2015/04/03 Python
快速排序的算法思想及Python版快速排序的实现示例
2016/07/02 Python
从零开始学Python第八周:详解网络编程基础(socket)
2016/12/14 Python
python使用tensorflow保存、加载和使用模型的方法
2018/01/31 Python
Python图像处理之颜色的定义与使用分析
2019/01/03 Python
python快速排序的实现及运行时间比较
2019/11/22 Python
Python turtle画图库&amp;&amp;画姓名实例
2020/01/19 Python
python实现Oracle查询分组的方法示例
2020/04/30 Python
一文轻松掌握python语言命名规范规则
2020/06/18 Python
Django:使用filter的pk进行多值查询操作
2020/07/15 Python
python 中关于pycharm选择运行环境的问题
2020/10/31 Python
使用HTML5捕捉音频与视频信息概述及实例
2018/08/22 HTML / CSS
阿迪达斯奥地利官方商城:adidas.at
2016/10/16 全球购物
计划生育工作总结2015
2015/04/03 职场文书
法制工作总结2015
2015/07/23 职场文书
学习商务礼仪心得体会
2016/01/22 职场文书
高一数学教学反思
2016/02/18 职场文书
详解盒子端CSS动画性能提升
2021/05/24 HTML / CSS