在python中,try/except语句也主要是用于处理程序正常执行过程中出现的一些异常情况,常见的异常如下:
python程序在发现了except之后的某个错误时,往往会中断不再向下执行
try:
normal excute block
except A:
Except A handle
except B:
Except B handle
.........
except:
other exception handle
else:
if no exception,get here
finally:
print(hello world)
当try代码块执行出现异常,在except中匹配到了A的异常,则执行了对应A handle的语句;在except中匹配到了B的异常,则执行了对应B handle的语句;没有在列出的异常中则执行except语句,并相应的执行other handle。
注意??:区别except A语句和单独的except 语句,如果没有最后的except:语句,当出现的错误是代码中所有except XX语句都不曾列出的异常,则代码依旧会出现报错,而非给出handle结果。
通过下面的例子来更好的进行理解:
def divide(x, y): try: result = x / y except ZeroDivisionError, e: print "division by zero! " + str(e) else: print "result is", result finally: print "executing finally clause"
>>> divide(3,4)
result is 0
executing finally clause
可以发现代码未有报错,执行到了else语句,且finally语句执行
>>>divide(3,0)
division by zero! integer division or modulo by zero
executing finally clause
可以发现分母为0,执行到了except中的异常语句,且finally语句也执行
>>> divide(3,’0‘)
File "<stdin>", line 1
divide(3,’0‘)
^
SyntaxError: invalid syntax
此时代码中有string,而函数中必须是要求数字才能执行,但该函数中except语句只定义了一种ZeroDivisionError的异常,所以最后运行报了SyntaxError
对代码进行优化,如下:
def divideNew(x, y): try: result = x / y except ZeroDivisionError, e: print "division by zero! " + str(e) except TypeError: divideNew(int(x), int(y)) else: print "result is", result finally: print "executing finally clause"
>>> divideNew(‘4‘,‘3‘)
result is 1
executing finally clause
executing finally clause
可以看到,虽然数字依旧是以string的格式输入,但执行了except TypeError语句,给出了该异常的handle语句,即int(x),int(y)改变了变量类型;
并且可以看到执行了else语句;
出现了两次finally语句是因为执行了一次divideNew(‘4‘,‘3‘),又执行了一次divideNew(int(‘4‘),int(‘3‘)),再次说明finally 是每次都会执行的语句
对于else语句,当出现异常时,else block不执行;而当程序无异常时,才会执行else语句。
对于finally语句,无论try语句是否出现异常,最后都要执行抓断finally的代码。
根据上面指出的的标准格式,except x必须在exept语句之前,except必须在else和finally之前,finally必须在else之后(最后)。否则会报语法错误。
python try语句(try/except/else/finally)
原文:https://www.cnblogs.com/zahl/p/10349194.html