python捕获函数异常 python捕获错误( 三 )


复制代码 代码如下:
try:
try_suite
except Exception:
exception block
举个例子:
复制代码 代码如下:
try:
...res = 2/0
... except ZeroDivisionError:
...print "Error:Divisor must not be zero!"
...
Error:Divisor must not be zero!
看,我们真的捕获到了ZeroDivisionError异常!那如果我想捕获并处理多个异常怎么办呢?有两种办法,一种是给一个except子句传入多个异常类参数,另外一种是写多个except子句,每个子句都传入你想要处理的异常类参数 。甚至,这两种用法可以混搭呢!下面我就来举个例子 。
复制代码 代码如下:
try:
floatnum = float(raw_input("Please input a float:"))
intnum = int(floatnum)
print 100/intnum
except ZeroDivisionError:
print "Error:you must input a float num which is large or equal then 1!"
except ValueError:
print "Error:you must input a float num!"
[root@Cherish tmp]# python test.py
Please input a float:fjia
Error:you must input a float num!
[root@Cherish tmp]# python test.py
Please input a float:0.9999
Error:you must input a float num which is large or equal then 1!
[root@Cherish tmp]# python test.py
Please input a float:25.091
4
上面的例子大家一看都懂,就不再解释了 。只要大家明白,我们的except可以处理一种异常 , 多种异常,甚至所有异常就可以了 。
大家可能注意到了,我们还没解释except子句后面那个Argument是什么东西?别着急,听我一一道来 。这个Argument其实是一个异常类的实例(别告诉我你不知到什么是实例),包含了来自异常代码的诊断信息 。也就是说,如果你捕获了一个异常,你就可以通过这个异常类的实例来获取更多的关于这个异常的信息 。例如:
复制代码 代码如下:
try:
...1/0
... except ZeroDivisionError,reason:
...pass
...
type(reason)
type 'exceptions.ZeroDivisionError'
print reason
integer division or modulo by zero
reason
ZeroDivisionError('integer division or modulo by zero',)
reason.__class__
type 'exceptions.ZeroDivisionError'
reason.__class__.__doc__
'Second argument to a division or modulo operation was zero.'
reason.__class__.__name__
'ZeroDivisionError'
上面这个例子,我们捕获了除零异常,但是什么都没做 。那个reason就是异常类ZeroDivisionError的实例,通过type就可以看出 。
2.2try ... except...else语句
现在我们来说说这个else语句 。Python中有很多特殊的else用法,比如用于条件和循环 。放到try语句中,其作用其实也差不多:就是当没有检测到异常的时候,则执行else语句 。举个例子大家可能更明白些:
复制代码 代码如下:
import syslog
try:
...f = open("/root/test.py")
... except IOError,e:
...syslog.syslog(syslog.LOG_ERR,"%s"%e)
... else:
...syslog.syslog(syslog.LOG_INFO,"no exception caught\n")
...
f.close()
2.3 finally子句
finally子句是无论是否检测到异常 , 都会执行的一段代码 。我们可以丢掉except子句和else子句,单独使用try...finally , 也可以配合except等使用 。
例如2.2的例子,如果出现其他异常,无法捕获,程序异常退出,那么文件 f 就没有被正常关闭 。这不是我们所希望看到的结果,但是如果我们把f.close语句放到finally语句中,无论是否有异常,都会正常关闭这个文件,岂不是很 妙
复制代码 代码如下:
import syslog
try:
...f = open("/root/test.py")
... except IOError,e:
...syslog.syslog(syslog.LOG_ERR,"%s"%e)
... else: