zoukankan      html  css  js  c++  java
  • 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 ' Why 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

     

     

  • 相关阅读:
    转载:[Oracle]杀死正在执行的sql语句
    转载:记录一次MySQL两千万数据的大表优化解决过程
    转载:logback日志详解
    转载:MySQL千万级大表优化攻略
    使用dbUnit的 IDataSet 因乱序造成assert失败而采取的措施
    解锁用户scott并授权
    两表连接各种Join图示,SQL及查询结果
    一句Delete..In.. 删除语句的优化
    大数据技术之_08_Hive学习_02_DDL数据定义(创建/查询/修改/删除数据库+创建表+分区表+修改表+删除表)+DML数据操作(数据导入+数据导出+清除表中数据)
    大数据技术之_08_Hive学习_01_Hive入门+Hive安装、配置和使用+Hive数据类型
  • 原文地址:https://www.cnblogs.com/xuanhun/p/5756033.html
Copyright © 2011-2022 走看看