程序员总是和各种错误打交道,学习如何识别并正确的处理程序错误是很有必要的。
7.1错误和异常
1、错误
从软件方面来看,错误分为语法错误和逻辑错误两种。这两种错误都将导致程序无法正常进行下去,当Python检测到一个错误时就出现了异常。
2、异常
当编译器检测到错误并且意识到错误条件。解释器会引发一个异常(程序员也可以自己引发一个异常,后面会说到)。
以下是7种Python中常见的错误。
1、NameError,尝试访问一个未申明的例子。
2、ZeroDivisionError,零除错误。
3、SynataxError,解释器语法错误。
4、IndexError,请求的索引超出范围。
5、KeyError,请求一个不存在的字典Key。
6、IOError,输入输出错误,例如尝试打开一个不存在的文件。
7、AttributeError,尝试访问 为未知的对象属性。
7.2异常检测和异常处理
7.2.1 try-excep语句
try:
FileTest=open('blash','r')
except IOError,e:
print 'could not open file'
此时当发生输入输出错误的时候程序不会停止,而是捕获异常显示预先定义的字符串。需要注意的是只有当捕获IOError时会执行print语句,当发生其他类型的异常时程序仍会停止,此时我们我们可能需要带多个except的try语句。
7.2.2带有多个except的try语句
可以将多个except语句连起来,如下所示
except Exception1[,reason1]:
suit_for_exception1
except Exception2[,reason2]:
sut_for_exception2
程序执行时未发生错误忽略所有except语句,如果发生异常则在多个except语句中查找匹配的异常。这样开发时既能捕获多种类型异常,帮助我们处理错误。
7.2.3捕获所有异常
根据上面带多个except的语句可以捕获多种异常,但事实上程序总会发生我们意想不到的异常,所有如果可以捕获所有异常而不仅限于我们指定的异常那么对开发将有比较大的帮助。
但是捕获所有所有异常有个缺陷,就是它不会告诉你到底捕获了什么异常,也无法让你应对不同类型的异常。
它的用法是:
try: except (KeyboardInterrupt,SystemExit):
#user wants quit
raise
except Exception:
#handle real Errors
需要解释的是KeyboardInterrupt,SystemExit并不是真正意义上的异常,前者是用户按下Ctrl+C后者表示程序需要退出,所以想要程序正常退出时不被捕获异常需要上面的代码。
7.2.4获取异常原因
捕获异常后只有得到异常发生的原因才能帮助我们改进。
except语句的使用:
except exception[,reason]
括号中的reason即是异常的原因,异常参数。异常参数可以忽略,如果需要访问异常的原因那么reason则是必须的。reason是包含导致异常的代码的诊断信息的类实例,虽然从异常的名字就可以获知发生了何种异常,但是reason将提供更多的异常信息。
用法如下:
def safe_float(object):
try:
retval=float(object)
except (ValueError,TypeError),reason:
retval=str(reason)
return retval print safe_float('xyz')
程序将显示could not convert string to float: xyz,是的编译器返回了具体的错误原因。
7.2.5 else 语句
我们已经见过if-else,while-else语句,try-except-else当然也是可以使用的,其意义是在try范围内没有异常检查到则执行else语句。
7.2.6 finally语句
try-except-finally中的finally子句表示无论是否捕获到异常都将执行的一段代码。当然"try-except-else-finally"也是完全可以搭配的。很简单不在多说,需要注意的是except语句可以有不止一个,但是至少要有一个。else和finally都是可选的。
7.3异常触发
7.3.1 raise语句
有时我们可能需要引发一个异常,此时需要raise语句。使用如下:
raise [SomeException[,args[,traceback]]]
第一个参数SomeException是必要的,你需要提供要引发的异常名。第二个参数args是将参数传递给异常;第三个参数是用于异常-正常化(exception-narmally)的跟踪记录(traceback)记录。当程序运行到raise语句时会跳出并引发你需要的异常。
7.4断言
7.4.1 断言可以理解为(raise if not...)当布尔值为假时抛出异常。断言关键字为assert,用法如下:
assert expression[,arguments]
表达式后面是我们提供的异常参数。