Python黑帽编程2.7 异常处理

摘要

异常是个很宽泛的概念,如果程序没有按预想的执行,都可以说是异常了。遇到一些特殊情况没处理会引发异常,比如读文件的时候文件不存在,网络连接超时。程序本身的错误也可以算作异常,比如把字符串当整数来处理,拼写错误。

Python黑帽编程2.7 异常处理

Python 黑帽编程 2.7 异常处理

异常是个很宽泛的概念,如果程序没有按预想的执行,都可以说是异常了。遇到一些特殊情况没处理会引发异常,比如读文件的时候文件不存在,网络连接超时。程序本身的错误也可以算作异常,比如把字符串当整数来处理,拼写错误。

不论是系统还是框架,都会对基本异常进行分类,比如 IO 异常,内存溢出等等。很多时候,针对特有的业务,我们也可以自定异常。

下面我们先看一个引发异常的例子:

Print 'hello'

这个例子很简单,我们将 print 的首字母大写。这会引发一个错误:

Python黑帽编程2.7 异常处理

2

我们可以观察到有一个 SyntaxError 被引发,并且检测到的错误位置也被打印了出来。捕获错误,打印错误信息,这本身就是一种异常处理。那么我们如何在代码中处理异常呢?

2.7.1 try ….except

例如我们用如下代码去打开文件:

open('abc.txt','r')

但是要打开的文件并不存在,这个时候程序就会抛出异常,如下图所示:

Python黑帽编程2.7 异常处理

3

我们看到抛出的错误为 IOError ,那么我们可以使用如下的代码来处理这个异常。

try:

open('abc.txt','r')

except IOError,msg:

print msg

运行结果如下:

Python黑帽编程2.7 异常处理

4

我们把所有可能引发错误的语句放在 try 块中,然后在 except 从句中处理所有的错误和异常。 except 从句可以专门处理单一的错误或异常,或者一组包括在圆括号内的错误 / 异常。如果没有给出错误或异常的名称,它会处理   所有的   错误和异常。对于每个 try 从句,至少都有一个相关联的 except 从句。

例如:

try:

open('abc.txt','r')

except IOError,msg:

print msg

except:

print 'other erro'

如果某个错误或异常没有被处理,默认的 Python 处理器就会被调用。它会终止程序的运行,并且打印一个消息,我们已经看到了这样的处理。

2.7.2 抛出异常

我们可以使用 raise 语句 引发 异常。你还得指明错误 / 异常的名称和伴随异常 触发的 异常对象。我们可以引发的错误或异常应该分别是一个 Error Exception 类的直接或间接导出类。

我们先看示例代码:

#!/usr/bin/python

class ShortInputException(Exception):

'''A user-defined exception class.'''

def __init__(self, length, atleast):

Exception.__init__(self)

self.length = length

self.atleast = atleast

try:

s = raw_input('Enter something --> ')

if len(s) < 3:

raise ShortInputException(len(s), 3)

# Other work can continue as usual here

except EOFError:

print '/nWhy did you do an EOF on me?'

except ShortInputException, x:

print 'ShortInputException: The input was of length %d, /

was expecting at least %d' % (x.length, x.atleast)

else:

print 'No exception was raised.'

这段代码中我们首先自定义了一个 ShortInputException 类,它继承自 Exception 类,构造函数接受两个参数输入字符串的长度和最小长度。接下来代码中,我们获取用户输入,判断长度是否小于 3 ,如果小于 3 触发 ShortInputException 。我们从终端启动这个脚本, 运行结果如下:

Python黑帽编程2.7 异常处理

5

2.7.3 try..finally

当我们需要不管是否有异常,都要执行某段代码的时候,就需要 finally 出场了。看下面的示例:

def test1():

try:

print('to do stuff')

raise Exception('hehe')

print('to return in try')

return 'try'

except Exception:

print('process except')

print('to return in except')

return 'except'

finally:

print('to return in finally')

return 'finally'

test1Return = test1()

print('test1Return : ' + test1Return)

try raise 一个异常,就立刻转入 except 中执行,在 except 中遇到 return 时,就强制转到 finally 中执行, finally 中遇到 return 时就返回。运行结果如下:

Python黑帽编程2.7 异常处理

6

2.7.9 小结

本节我们学习了 Python 中基本的异常处理,和自定义异常的方法。

下一节我们学习套接字编程。

2.7 节《 套接字编程 》已经在微信订阅号抢先发布,心急的同学进入订阅号(二维码在下方),从菜单 网络安全 ”—>”Python 黑帽编程 进入即可。

由于教程仍在创作过程中,在整套教程完结前,感兴趣的同学请关注我的微信订阅号( xuanhun521 ,下方二维码),我会第一时间在订阅号推送图文教程和视频教程。问题讨论请加 qq 群: Hacking 1 群): 303242737   Hacking 2 群): 147098303

Python黑帽编程2.7 异常处理

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: