首页 > 编程 > Python > 正文

解析Python中的异常处理

2020-02-23 00:56:11
字体:
来源:转载
供稿:网友

在程序运行的过程中,如果发生了错误,可以事先约定返回一个错误代码,这样,就可以知道是否有错,以及出错的原因。在操作系统提供的调用中,返回错误码非常常见。比如打开文件的函数open(),成功时返回文件描述符(就是一个整数),出错时返回-1。

用错误码来表示是否出错十分不便,因为函数本身应该返回的正常结果和错误码混在一起,造成调用者必须用大量的代码来判断是否出错:

def foo(): r = some_function() if r==(-1):  return (-1) # do something return rdef bar(): r = foo() if r==(-1):  print 'Error' else:  pass

一旦出错,还要一级一级上报,直到某个函数可以处理该错误(比如,给用户输出一个错误信息)。

所以高级语言通常都内置了一套try...except...finally...的错误处理机制,Python也不例外。
try

让我们用一个例子来看看try的机制:

try: print 'try...' r = 10 / 0 print 'result:', rexcept ZeroDivisionError, e: print 'except:', efinally: print 'finally...'print 'END'

当我们认为某些代码可能会出错时,就可以用try来运行这段代码,如果执行出错,则后续代码不会继续执行,而是直接跳转至错误处理代码,即except语句块,执行完except后,如果有finally语句块,则执行finally语句块,至此,执行完毕。

上面的代码在计算10 / 0时会产生一个除法运算错误:

try...except: integer division or modulo by zerofinally...END

从输出可以看到,当错误发生时,后续语句print 'result:', r不会被执行,except由于捕获到ZeroDivisionError,因此被执行。最后,finally语句被执行。然后,程序继续按照流程往下走。

如果把除数0改成2,则执行结果如下:

try...result: 5finally...END

由于没有错误发生,所以except语句块不会被执行,但是finally如果有,则一定会被执行(可以没有finally语句)。

你还可以猜测,错误应该有很多种类,如果发生了不同类型的错误,应该由不同的except语句块处理。没错,可以有多个except来捕获不同类型的错误:

try: print 'try...' r = 10 / int('a') print 'result:', rexcept ValueError, e: print 'ValueError:', eexcept ZeroDivisionError, e: print 'ZeroDivisionError:', efinally: print 'finally...'print 'END'

int()函数可能会抛出ValueError,所以我们用一个except捕获ValueError,用另一个except捕获ZeroDivisionError。

此外,如果没有错误发生,可以在except语句块后面加一个else,当没有错误发生时,会自动执行else语句:

try: print 'try...' r = 10 / int('a') print 'result:', rexcept ValueError, e: print 'ValueError:', eexcept ZeroDivisionError, e: print 'ZeroDivisionError:', eelse: print 'no error!'finally: print 'finally...'print 'END'            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表