关闭

Python中的try... exception

标签: Python异常处理
733人阅读 评论(0) 收藏 举报
分类:

异常处理

在项目开发中,异常处理是不可或缺的。异常处理帮助人们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


一些常用的异常

exception EOFError

Raised when one of the built-in functions (input() or raw_input())hits an end-of-file condition (EOF) without reading any data. (N.B.: thefile.read() and file.readline() methods return an empty stringwhen they hit EOF.)

exception IOError

Raised when an I/O operation (such as a print statement, the built-inopen() function or a method of a file object) fails for an I/O-relatedreason, e.g., “file not found” or “disk full”.

This class is derived from EnvironmentError. See the discussion abovefor more information on exception instance attributes.

Changed in version 2.6: Changed socket.error to use this as a base class.

Exception hierarchy

BaseException
 +-- SystemExit
 +-- KeyboardInterrupt
 +-- GeneratorExit
 +-- Exception
      +-- StopIteration
      +-- StandardError
      |    +-- BufferError
      |    +-- ArithmeticError
      |    |    +-- FloatingPointError
      |    |    +-- OverflowError
      |    |    +-- ZeroDivisionError
      |    +-- AssertionError
      |    +-- AttributeError
      |    +-- EnvironmentError
      |    |    +-- IOError
      |    |    +-- OSError
      |    |         +-- WindowsError (Windows)
      |    |         +-- VMSError (VMS)
      |    +-- EOFError
      |    +-- ImportError
      |    +-- LookupError
      |    |    +-- IndexError
      |    |    +-- KeyError
      |    +-- MemoryError
      |    +-- NameError
      |    |    +-- UnboundLocalError
      |    +-- ReferenceError
      |    +-- RuntimeError
      |    |    +-- NotImplementedError
      |    +-- SyntaxError
      |    |    +-- IndentationError
      |    |         +-- TabError
      |    +-- SystemError
      |    +-- TypeError
      |    +-- ValueError
      |         +-- UnicodeError
      |              +-- UnicodeDecodeError
      |              +-- UnicodeEncodeError
      |              +-- UnicodeTranslateError
      +-- Warning
           +-- DeprecationWarning
           +-- PendingDeprecationWarning
           +-- RuntimeWarning
           +-- SyntaxWarning
           +-- UserWarning
           +-- FutureWarning
	   +-- ImportWarning
	   +-- UnicodeWarning
	   +-- BytesWarning


0
0
查看评论

嵌入式 python异常except语句用法与引发异常

except: #捕获所有异常 except: : #捕获指定异常 except: except:,:捕获指定异常及其附加的数据 except:::捕获异常名1或者异常名2,及附加的数据库 常用异常名: 异常名    描述 AttributeError 调用不存在的方法引发的...
  • skdkjxy
  • skdkjxy
  • 2013-12-02 14:40
  • 2633

python Exception as e和 Exception,e

捕获一个异常对象 as e 是python 2.5之后的方案
  • pzqingchong
  • pzqingchong
  • 2016-03-12 15:58
  • 1582

Python 和 Java 异常处理对比

当你在编写程序时,可能由于人为或其它因素导致发生异常后,如果不对异常处理,程序就无法继续执行。Python语言中也有自己的异常处理,下面我们先看下Java中的异常处理,然后再对比Python中的异常处理,其实它们都大同小异。java 中的异常处理我们不做过多介绍,只是为了和python的异常处理做对...
  • HG_Harvey
  • HG_Harvey
  • 2017-07-01 13:43
  • 392

python的异常Exception

 Python 的异常处理机制Python代码  try:      raise Exception("a", "b")        ex...
  • sding
  • sding
  • 2010-04-21 12:13
  • 29066

24 Python assert,Exception的异常信息为unicode的中文时

Python assert,Exception的异常信息为uicode的中文
  • lis_12
  • lis_12
  • 2016-12-29 16:01
  • 1141

Tensorflow报错tensorflow.python.framework.errors_impl.InvalidArgumentError exception str() failed原因

用Tensorflow跑自己的数据集时,用saver将参数保存在checkpoint中。后来在在测试的时候,用saver.restore导入模型到Session中,报如下错误:tensorflow.python.framework.errors_impl.InvalidArgumentError e...
  • check2255
  • check2255
  • 2017-10-23 18:48
  • 1423

Python中的异常(Exception)

python学习笔记之异常(Exception)
  • Laneruan
  • Laneruan
  • 2017-02-22 13:49
  • 270

Python如何自定义异常

在python中,只需继承Exception,就可以实现自定义异常类 class printException(Exception): pass 只有两行代码,是不是很简单呢,那么如何使用呢? def testRaise(): raise printException('pr...
  • KWSY2008
  • KWSY2008
  • 2015-11-14 13:36
  • 7859

P-1.8 Python简单异常处理 try... 语句

非常简单。 一、try语句 except: 捕获所有异常 except name: 只捕获特定的异常 except name,value: 捕获异常和它的附加数据(将异常的信息保存到value,) except (name1,name2): 捕获任何列出的异常 e...
  • frankfrankflb
  • frankfrankflb
  • 2018-01-14 00:19
  • 14

Python异常处理和异常类型

Python异常处理和异常类型目录 Python异常处理和异常类型 目录 python2x捕获异常语法 python3x捕获异常语法 python常见的异常类型 NameError尝试访问一个未申明的变量 ZeroDivisionError除数为0 SyntaxError语法错误 IndexErro...
  • TskyFree
  • TskyFree
  • 2015-09-21 18:58
  • 5276
    个人资料
    • 访问:248092次
    • 积分:3126
    • 等级:
    • 排名:第13185名
    • 原创:87篇
    • 转载:94篇
    • 译文:0篇
    • 评论:15条
    文章分类
    最新评论