异常(exceptions)是Python中一种非常重要的类型,它和语法错误不同,是在程序运行期间引发的错误。Python中内置了很多异常,如IOError、NameError、KeyboardInterrupt等。
异常的意义在于提供一种更加优雅的错误处理方式。例如用Python编写一个计算器,如果用户输入了不能计算的对象,则可以抛出异常,并进行处理,如下:
while True:
try:
x = int(input('Please In enter A number:'))
print "Your Input is %s" % x
break
except Exception, e:
print e
Python是一门面向对象的语言,异常本身也是对象。用dir(Exception)查看Exception类的属性,可以看到:
['__class__', '__delattr__', '__dict__', '__doc__',
'__format__', '__getattribute__', '__getitem__',
'__getslice__', '__hash__', '__init__', '__new__',
'__reduce__', '__reduce_ex__', '__repr__',
'__setattr__', '__setstate__', '__sizeof__', '__str__',
'__subclasshook__', '__unicode__', 'args', 'message']
除开args和message外,其余大部分都是内部属性。其中args是传递给异常类构造函数的一个元组类型参数,一些内置异常,例如IOError,可能需要接收多个参数;其它异常则可以直接传递一个错误提示字符串。
Python的异常可以通过try语句来检查,任何在try语句块里的代码都会被监测,检查是否有异常产生。except会根据指定的异常类型进行捕获,并执行except内的代码。
那么,这里就不禁要问,except后面的两个参数到底是什么?如果第一个是错误的类型,那么第二个参数呢?
对其进行检测后发现,它属于Exception的实例,也就是说,它是由异常类产生的一个具体异常对象。
那么,如果用户需要自定义一个异常呢?Python中规定,所有异常必须直接或者间接地继承自Exception类。如下,自定义一个异常:
#!/usr/bin/env python
class MyError(Exception):
def __init__(self, *args):
self.value = args[0]
def __str__(self):
return repr(self.value)
def showname(*args):
if args:
print args
else:
raise MyError('Error: need 1 arguments at last, 0 Input')
把这个文件保存为showname.py,其它模块就可以引入并调用showname函数,同时对它执行的结果进行异常捕获:
#!/usr/bin/env python
import showname
try:
showname.showname()
except showname.MyError, e:
print e
值得注意的几点是:
- Python中使用raise抛出异常;
- 由于所有异常都继承自Exception,所以当不确定异常类型的时候,可以在except后面直接使用Exception来捕获所有异常;
- 由于异常之间存在继承关系,异常内的属性也可以被重新定义,还可以在自定义异常中增加自己的属性。
评论0
欢迎分享你的看法,也欢迎补充不同的实践经验。