详解在Python中处理异常的教程


Posted in Python onMay 24, 2015

什么是异常?

异常是一个事件,其中一个程序,破坏程序的指令的正常流的执行过程中而发生的。一般情况下,当一个Python脚本遇到一些情况不能处理,就抛出一个异常。异常是一个Python对象,它表示一个错误。

当Python脚本抛出一个异常,它必须处理异常,否则将立即终止。
处理异常:

如果有可能会引发异常的一些可疑的代码,就可以通过将可疑的代码在一个try块:保卫你的程序。在try块,包括以下情况except:语句,其次是代码,作为优雅的处理问题,尽可能块。
语法

这里是try....except...else 块的简单语法:

try:
  You do your operations here;
  ......................
except ExceptionI:
  If there is ExceptionI, then execute this block.
except ExceptionII:
  If there is ExceptionII, then execute this block.
  ......................
else:
  If there is no exception then execute this block.

这里有一些关于上述语法要点:

  •     单个try语句可以有多个不同的语句。当try块中包含可能会引发不同类型的异常语句,这是很有用的。
  •     也可以提供一个通用的except子句,它用来处理任何异常。
  •     except子句后,可以包括其他子句。块没有引发异常:在别的块中的代码,如果在try中的代码执行。
  •     在else块是不需要try:块的代码的保护。

例子

这里是简单的例子,这将打开一个文件并写入内容的文件中并移出正常:

#!/usr/bin/python

try:
  fh = open("testfile", "w")
  fh.write("This is my test file for exception handling!!")
except IOError:
  print "Error: can\'t find file or read data"
else:
  print "Written content in the file successfully"
  fh.close()

这将产生以下结果:

Written content in the file successfully

示例:

这里有一个更简单的例子,它试图打开没有权限并在文件中写入内容,所以它会引发一个异常:

#!/usr/bin/python

try:
  fh = open("testfile", "r")
  fh.write("This is my test file for exception handling!!")
except IOError:
  print "Error: can\'t find file or read data"
else:
  print "Written content in the file successfully"

这将产生以下结果:

Error: can't find file or read data

在except子句无异常:

还可以使用不同的定义如下无异常的声明:

try:
  You do your operations here;
  ......................
except:
  If there is any exception, then execute this block.
  ......................
else:
  If there is no exception then execute this block.

try-except 语句捕获所有出现的异常。使用这种try-except 声明不被认为是一个良好的编程习惯,但因为它捕获所有异常,但不会使程序员找出可能出现的问题的根本原因。
在except子句的多个异常:

也可以使用相同的除语句来处理多个异常,如下所示:

try:
  You do your operations here;
  ......................
except(Exception1[, Exception2[,...ExceptionN]]]):
  If there is any exception from the given exception list, 
  then execute this block.
  ......................
else:
  If there is no exception then execute this block.

try-finally 语句:

可以使用finally:块连同try:块。在try块是否引发异常或没有任何代码 finally块是一个必须执行的块。try-finally语句的语法是这样的:

try:
  You do your operations here;
  ......................
  Due to any exception, this may be skipped.
finally:
  This would always be executed.
  ......................

请注意,可以提供except子句或finally子句,但不能同时使用。不能同时使用else子句与finally子句。
例子:

#!/usr/bin/python

try:
  fh = open("testfile", "w")
  fh.write("This is my test file for exception handling!!")
finally:
  print "Error: can\'t find file or read data"

如果没有权限,以写入方式打开文件,那么这将产生以下结果:

Error: can't find file or read data

同样的例子可以写入更简洁,如下所示:

#!/usr/bin/python

try:
  fh = open("testfile", "w")
  try:
   fh.write("This is my test file for exception handling!!")
  finally:
   print "Going to close the file"
   fh.close()
except IOError:
  print "Error: can\'t find file or read data"

当一个异常被抛出在try块中,执行立即传递到finally块。finally块中的所有语句都执行,该异常被再次抛出,并在被处理 except 语句如果出现在一个更高的层在try-except语句。
Exception参数:

异常可以有一个参数,参数是一个值,它给出了关于这个问题的其他信息。参数按异常内容改变。可以通过不同的子句提供一个变量,如下所示捕获异常的参数:

try:
  You do your operations here;
  ......................
except ExceptionType, Argument:
  You can print value of Argument here...

如果正在编写代码来处理一个异常,可以有一个变量按照异常的名称在不同的声明。如果捕捉多个异常,可以有一个变量按照异常的元组。

这个变量将接收主要包含异常原因的异常值。该变量可以在一个元组的形式接收一个或多个值。该元组通常包含错误串,错误码和一个错误的位置。
示例:

下面是一个异常的例子:

#!/usr/bin/python

# Define a function here.
def temp_convert(var):
  try:
   return int(var)
  except ValueError, Argument:
   print "The argument does not contain numbers\n", Argument

# Call above function here.
temp_convert("xyz");

这将产生以下结果:

The argument does not contain numbers
invalid literal for int() with base 10: 'xyz'

抛出异常:

可以通过使用raise语句抛出几个方面的异常。一般raise语句的语法。
语法

raise [Exception [, args [, traceback]]]

这里,Exception是异常的类型(例如,NameError)和参数是用于异常的参数值。该参数是可选的;如果未提供,则异常的参数是None。

最后一个参数traceback,也是可选的(并且在实践中很少使用),并且如果存在的话,那么用于异常回溯对象。
例子:

异常可以是一个字符串,一个类或一个对象。大多数Python核心抛出是类,有参数认为是类的实例的异常。定义新的异常是很容易的,可以参考如下:

def functionName( level ):
  if level < 1:
   raise "Invalid level!", level
   # The code below to this would not be executed
   # if we raise the exception

注:为了捕获一个异常,“except”语句必须引用抛出类对象或简单的字符串相同的异常。例如,捕捉到上面的异常,必须写except子句,如下所示:

try:
  Business Logic here...
except "Invalid level!":
  Exception handling here...
else:
  Rest of the code here...

用户定义的异常:

Python中,还可以通过内置的异常标准的派生类来创建自己的异常。

下面是有关RuntimeError一个例子。这里是从RuntimeError子类的类被创建。当需要显示更多的具体信息时,一个异常被捕获,这是很有用的。

在try块中,用户定义的异常引发,并夹在except块。变量e被用来创建类Networkerror的一个实例。

class Networkerror(RuntimeError):
  def __init__(self, arg):
   self.args = arg

所以一旦在上面定义的类,可以按如下方法抛出异常:

try:
  raise Networkerror("Bad hostname")
except Networkerror,e:
  print e.args
Python 相关文章推荐
python中的列表推导浅析
Apr 26 Python
python通过exifread模块获得图片exif信息的方法
Mar 16 Python
详解Python中open()函数指定文件打开方式的用法
Jun 04 Python
浅谈python 线程池threadpool之实现
Nov 17 Python
Python工程师面试必备25条知识点
Jan 17 Python
使用NumPy和pandas对CSV文件进行写操作的实例
Jun 14 Python
Win8下python3.5.1安装教程
Jul 29 Python
Python3.7将普通图片(png)转换为SVG图片格式(网站logo图标)动起来
Apr 21 Python
python判断字符串以什么结尾的实例方法
Sep 18 Python
Django haystack实现全文搜索代码示例
Nov 28 Python
Python使用Pygame绘制时钟
Nov 29 Python
Python类型转换的魔术方法详解
Dec 23 Python
Python中关于使用模块的基础知识
May 24 #Python
详解Python中的各种函数的使用
May 24 #Python
Python标准库之Sys模块使用详解
May 23 #Python
Python OS模块常用函数说明
May 23 #Python
在Python中操作时间之tzset()方法的使用教程
May 22 #Python
详解Python中time()方法的使用的教程
May 22 #Python
在Python中操作时间之strptime()方法的使用
Dec 30 #Python
You might like
destoon实现调用图文新闻的方法
2014/08/21 PHP
PHP调用.NET的WebService 简单实例
2015/03/27 PHP
php中smarty变量修饰用法实例分析
2015/06/11 PHP
php+html5实现无刷新图片上传教程
2016/01/22 PHP
yii2控制器Controller Ajax操作示例
2016/07/23 PHP
PHP重载基础知识回顾
2020/09/10 PHP
在js(jquery)中获得文本框焦点和失去焦点的方法
2012/12/04 Javascript
jQuery 绑定事件到动态创建的元素上的方法实例
2013/08/18 Javascript
使用javascript实现页面定时跳转总结篇
2013/09/21 Javascript
Javascript 拖拽雏形(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
js中setTimeout()与clearTimeout()用法实例浅析
2015/05/12 Javascript
jQuery实现点击后标记当前菜单位置(背景高亮菜单)效果
2015/08/22 Javascript
基于javascript实现listbox左右移动
2016/01/29 Javascript
js获取当前年月日-YYYYmmDD格式的实现代码
2016/06/01 Javascript
Javascript 制作图形验证码实例详解
2016/12/22 Javascript
vue项目tween方法实现返回顶部的示例代码
2018/03/02 Javascript
Nodejs处理异常操作示例
2018/12/25 NodeJs
微信小程序页面间传值与页面取值操作实例分析
2019/04/30 Javascript
深入学习JavaScript中的bom
2019/05/27 Javascript
vue使用微信JS-SDK实现分享功能
2019/08/23 Javascript
js 判断当前时间是否处于某个一个时间段内
2019/09/19 Javascript
详解vue中在循环中使用@mouseenter 和 @mouseleave事件闪烁问题解决方法
2020/04/07 Javascript
浅谈vue在html中出现{{}}的原因及解决方式
2020/11/16 Javascript
[32:30]夜魇凡尔赛茶话会 第一期01:谁是卧底
2021/03/11 DOTA
python计算牛顿迭代多项式实例分析
2015/05/07 Python
使用Turtle画正螺旋线的方法
2017/09/22 Python
Python爬虫获取图片并下载保存至本地的实例
2018/06/01 Python
基于OpenCV python3实现证件照换背景的方法
2019/03/22 Python
tensorboard显示空白的解决
2020/02/15 Python
sklearn线性逻辑回归和非线性逻辑回归的实现
2020/06/09 Python
美国最大的香水出口:FragranceX.com
2017/11/04 全球购物
New Balance德国官方网站:购买鞋子和服装
2019/08/31 全球购物
节能宣传周活动总结
2014/05/08 职场文书
初中生庆国庆演讲稿范文2014
2014/09/25 职场文书
选对餐饮营销策略,营业额才会上涨
2019/08/27 职场文书
分享node.js实现简单登录注册的具体代码
2022/04/26 NodeJs