Python黑帽编程2.7 异常处理

Python黑帽编程2.7 异常处理

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

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

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

Print 'hello'

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

2

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

2.7.1 try ….except

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

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

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

3

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

try:

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

except IOError,msg:

    print msg

运行结果如下:

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语句 引发 异常。你还得指明错误/异常的名称和伴随异常 触发的 异常对象。我们可以引发的错误或异常应该分别是一个ErrorException类的直接或间接导出类。

我们先看示例代码:

#!/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。我们从终端启动这个脚本,运行结果如下:

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 时就返回。运行结果如下:

6

 

2.7.9 小结

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

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

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

 

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

 

 

posted @ 2016-08-13 00:00  玄魂  阅读(918)  评论(0编辑  收藏  举报