博客园  :: 首页  :: 联系 :: 订阅 订阅  :: 管理

学学python(2):错误和异常

Posted on 2010-03-05 22:21  生鱼片  阅读(2596)  评论(1编辑  收藏  举报

1.       python中有很多中异常,比如使用没有申请的变量会为NameError,语法不对为SyntaxError,请求的索引超出序列范围为IndexError

2.       异常处理:主要有两种形式try-excepttry-finally,我们只能使用其中的一种,一个try语句可以对应一个或多个except子句,但只能对应一个finally子句或是一个try-except-finally复合语句。

Try-except-else:检测和处理异常,else子句处理没有探测到异常时执行的代码。
try-finally
:检测并做一些必要的清除工作。
try-except-finally
:上面两者都可以做到。

下面举个例子说明,我们写一个转换为整数的函数,如下:

def ConInt(obj):

     try:

         result=int(obj)

     except ValueError:

         result="could not convert"

     except TypeError:

         result='type is wrong'

     return result

下面是函数调用:

>>> ConInt('asd')

'could not convert'

>>> ConInt([1,2])

'type is wrong'

我们也可以在一个except中处理多个异常,将异常写为元组的形式如下

def ConInt(obj):

     try:

         result=int(obj)

     except (ValueError,TypeError):

         result="could not convert" 

     return result

3.       异常参数,可以携带更详细的异常信息,该参数以元组的方式放在except后面,下面是例子。

>>> def ConInt(obj):

...  try:

...      result=int(obj)

...  except (ValueError,TypeError),diag:

...      result=str(diag)

...  return result

...

>>> ConInt('asd')

"invalid literal for int() with base 10: 'asd'"

>>> ConInt([1,3])

"int() argument must be a string or a number, not 'list'"

 

4.       With语句:只工作于支持上下文管理协议的对象。比如file对象就支持,那我们就可以使用wirh,如下:

With open(‘test.txt’,’r’) as f:

For eachLine in f:

     # do something

该段代码会视图打开一个文件,然后遍历文件中的每一行,完成后关闭文件,使用with的好处是这段代码无论哪里发生了异常,都会执行清理的代码,文件会被自动关闭。和使用try-finally是一样的。

5.       触发异常

使用raise[SomeException[,args [,traceback]]]语句来触发异常。

参数SomeException为触发异常的名字,必须是字符串,类或实例。

参数args为可选,指示错误原因的元组。

参数traceback,可选,当异常触发时新生成一个用于异常-正常话的追踪对象,当你想重新引发异常时,该参数很有用,可以用来区别先前和当前的位置,如果没有写None

6.可以通过sys模块中exc_info函数来获取异常信息,如下:

>>> try:

...  int('asdf')

... except:

...  import sys

...  exc_tuple=sys.exc_info()

...

>>> print exc_tuple

(<type 'exceptions.ValueError'>, ValueError("invalid literal for int() with base 10: 'asdf'",), <traceback object at 0x0164B6E8>)

>>> for item in exc_tuple:

...  print item

...  

<type 'exceptions.ValueError'>

invalid literal for int() with base 10: 'asdf'

<traceback object at 0x0164B6E8>

从后面的for中我们可以看出得到的异常元组包括三项信息,分别表示异常类,异常类的实例和追踪对象。

7.     下图为python异常的继承体系结构: 

clip_image002