Python黑帽编程2.7 异常处理

Python黑帽编程2.7异常处理
异常是个很宽泛的概念,如果程序没有按预想的执行,都可以说是异常了。遇到一些特殊情况没处理会引发异常,比如读文件的时候文件不存在,网络连接超时。程序本身的错误也可以算作异常,比如把字符串当整数来处理,拼写错误。
不论是系统还是框架,都会对基本异常进行分类,比如IO异常,内存溢出等等。很多时候,针对特有的业务,我们也可以自定异常。
下面我们先看一个引发异常的例子:
Print'hello'
这个例子很简单,我们将print的首字母大写。这会引发一个错误:

图2
我们可以观察到有一个SyntaxError被引发,并且检测到的错误位置也被打印了出来。捕获错误,打印错误信息,这本身就是一种异常处理。那么我们如何在代码中处理异常呢?
2.7.1TRY….EXCEPT
例如我们用如下代码去打开文件:
open('','r')
但是要打开的文件并不存在,这个时候程序就会抛出异常,如下图所示:

图3
我们看到抛出的错误为IOError,那么我们可以使用如下的代码来处理这个异常。
try:
open('','r')
exceptIOError,msg:
printmsg
运行结果如下:

图4
我们把所有可能引发错误的语句放在try块中,然后在except从句中处理所有的错误和异常。except从句可以专门处理单一的错误或异常,或者一组包括在圆括号内的错误/异常。如果没有给出错误或异常的名称,它会处理所有的错误和异常。对于每个try从句,至少都有一个相关联的except从句。
例如:
try:
open('','r')
exceptIOError,msg:
printmsg
except:
print'othererro'
如果某个错误或异常没有被处理,默认的Python处理器就会被调用。它会终止程序的运行,并且打印一个消息,我们已经看到了这样的处理。
2.7.2抛出异常
我们可以使用raise语句引发异常。你还得指明错误/异常的名称和伴随异常触发的异常对象。我们可以引发的错误或异常应该分别是一个Error或Exception类的直接或间接导出类。
我们先看示例代码:
Otherworkcancontinueasusualhere
exceptEOFError:
print'\nWhydidyoudoanEOFonme?'
exceptShortInputException,x:
print'ShortInputException:Theinputwasoflength%d,\
wasexpectingatleast%d'%(,)
else:
print'Noexceptionwasraised.'
这段代码中我们首先自定义了一个ShortInputException类,它继承自Exception类,构造函数接受两个参数输入字符串的长度和最小长度。接下来代码中,我们获取用户输入,判断长度是否小于3,如果小于3触发ShortInputException。我们从终端启动这个脚本,运行结果如下:

图5
2.7.3TRY..FINALLY
当我们需要不管是否有异常,都要执行某段代码的时候,就需要finally出场了。看下面的示例:
deftest1():
try:
print('todostuff')
raiseException('hehe')
print('toreturnintry')
return'try'
exceptException:
print('processexcept')
print('toreturninexcept')
return'except'
finally:
print('toreturninfinally')
return'finally'
test1Return=test1()
print('test1Return:'+test1Return)
在try中raise一个异常,就立刻转入except中执行,在except中遇到return时,就强制转到finally中执行,在finally中遇到return时就返回。运行结果如下:

图6
2.7.9小结
本节我们学习了Python中基本的异常处理,和自定义异常的方法。
下一节我们学习套接字编程。
查看系列教程,请
本文地址:https://yjs.zzxfkm.com.cn/417634579362.html
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。
友情链接