详解在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常用web框架简单性能测试结果分享(包含django、flask、bottle、tornado)
Aug 25 Python
Python中decorator使用实例
Apr 14 Python
python 异常处理总结
Oct 18 Python
浅谈Python黑帽子取代netcat
Feb 10 Python
Python实现查看系统启动项功能示例
May 10 Python
Python3+django2.0+apache2+ubuntu14部署网站上线的方法
Jul 07 Python
Python中正则表达式的用法总结
Feb 22 Python
浅谈python中get pass用法
Mar 19 Python
将 Ubuntu 16 和 18 上的 python 升级到最新 python3.8 的方法教程
Mar 11 Python
Jupyter Notebook打开任意文件夹操作
Apr 14 Python
详解Python中的for循环
Apr 30 Python
python实现商品进销存管理系统
May 30 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
索尼SONY SRF-S83/84电路分析和打磨
2021/03/02 无线电
PHP编码规范-php coding standard
2007/03/16 PHP
php 判断数组是几维数组
2013/03/20 PHP
PHP中使用Session配合Javascript实现文件上传进度条功能
2014/10/15 PHP
thinkphp获取栏目和文章当前位置的方法
2014/10/29 PHP
windows 2008r2+php5.6.28环境搭建详细过程
2019/06/18 PHP
客户端js性能优化小技巧整理
2013/11/05 Javascript
动态加载jquery库的方法
2014/02/12 Javascript
jquery UI Datepicker时间控件的使用方法(基础版)
2015/11/07 Javascript
javascript中apply/call和bind的使用
2017/02/15 Javascript
微信小程序 图片上传实例详解
2017/05/05 Javascript
js实现分页功能
2017/05/24 Javascript
详解Node.js中的Async和Await函数
2018/02/22 Javascript
基于angular6.0实现的一个组件懒加载功能示例
2018/04/12 Javascript
Webpack devServer中的 proxy 实现跨域的解决
2018/06/15 Javascript
浅谈Vue.js中如何实现自定义下拉菜单指令
2019/01/06 Javascript
简单了解JavaScript异步
2019/05/23 Javascript
jQuery中DOM常见操作实例小结
2019/08/01 jQuery
JS实现图片幻灯片效果代码实例
2020/05/21 Javascript
vue3+typeScript穿梭框的实现示例
2020/12/29 Vue.js
json.stringify()与json.parse()的区别以及用处
2021/01/25 Javascript
[01:53]3.19 DOTA2发布会 现场精彩Coser表演
2014/03/25 DOTA
[01:10:02]IG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python常用web框架简单性能测试结果分享(包含django、flask、bottle、tornado)
2014/08/25 Python
python执行等待程序直到第二天零点的方法
2015/04/23 Python
Windows中使用wxPython和py2exe开发Python的GUI程序的实例教程
2016/07/11 Python
python+opencv轮廓检测代码解析
2018/01/05 Python
Appium Python自动化测试之环境搭建的步骤
2019/01/23 Python
Python中six模块基础用法
2019/12/08 Python
python如何获取apk的packagename和activity
2020/01/10 Python
如何在django中运行scrapy框架
2020/04/22 Python
班组长的岗位职责
2013/12/09 职场文书
社区科普工作方案
2014/06/03 职场文书
网吧消防安全责任书
2014/07/29 职场文书
先进个人事迹材料
2014/12/29 职场文书
一起来看看Vue的核心原理剖析
2022/03/24 Vue.js