zoukankan      html  css  js  c++  java
  • 简明python教程 --C++程序员的视角(七):异常

    当你的程序中出现某些 异常的 状况的时候,异常就发生了。例如,当你想要读某个文件的时候,而那个文件不存在。或者在程序运行的时候,你不小心把它删除了。上述这些情况可以使用异常来处理。

    假如你的程序中有一些无效的语句,Python会引发并告诉你那里有一个错误,从而处理这样的情况。考虑一个简单的print语句。假如我们把print误拼为Print,注意大写,这样Python会 引发一个语法错误。

    我们可以观察到有一个SyntaxError被引发,并且检测到的错误位置也被打印了出来。这是这个错误的 错误处理器 所做的工作。

    image

     ValueError 数据不符合期望的格式(split()函数在s t ri n g中没有找到分隔符)

     try:

      role, words = line.split(':',1)

     except ValueError:

      pass

     IOEError 数据无法正常访问(如文件被移走或重命名)

     try:

      fdata = open("test.txt",'w')

      fmiss = open("est.txt",'w')

      pirnt fmiss.readline()

     except IOEError as err:

      print "File error:" + str(err)

     finally:

      if 'fdata' in locals():

        fdata.close()

      if 'fmiss' in locals():

        fmiss.close()

    用with处理文件,就不用操心文件的关闭

     try:

      with open('test.txt','w') as fdata, open('est.txt','w') as fmiss:

        print >>fdata,"Hello"

     except IOEError as err:

      print 'file error:' + str(err)

    try..except


    我们尝试读取用户的一段输入。按Ctrl-d,看一下会发生什么。

    >>> s = raw_input('Enter something --> ')
    Enter something --> Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    EOFError

    Python引发了一个称为EOFError的错误,这个错误基本上意味着它发现一个不期望的 文件尾 (由Ctrl-d表示)

    接下来,我们将学习如何处理这样的错误。

    处理异常


    我们可以使用try..except语句来处理异常。

    image

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

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

    你还可以让try..except块关联上一个else从句。当没有异常发生的时候,else从句将被执行。

    我们还可以得到异常对象,从而获取更多有个这个异常的信息。这会在下一个例子中说明。

    引发异常


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

    image

    image

    这里,我们创建了我们自己的异常类型,其实我们可以使用任何预定义的异常/错误。这个新的异常类型是ShortInputException类。它有两个域——length是给定输入的长度,atleast则是程序期望的最小长度。

    except从句中,我们提供了错误类和用来表示错误/异常对象的变量。这与函数调用中的形参和实参概念类似。在这个特别的except从句中,我们使用异常对象的lengthatleast域来为用户打印一个恰当的消息。

    try..finally


    假如你在读一个文件的时候,希望在无论异常发生与否的情况下都关闭文件,该怎么做呢?这可以使用finally块来完成。

    注意,在一个try块下,你可以同时使用except从句和finally。如果你要同时使用它们的话,需要把一个嵌入另外一个。

    image

    image

    我们进行通常的读文件工作,但是我有意在每打印一行之前用time.sleep方法暂停2秒钟。这样做的原因是让程序运行得慢一些(Python由于其本质通常运行得很快)。在程序运行的时候,按Ctrl-c中断/取消程序。

    我们可以观察到KeyboardInterrupt异常被触发,程序退出。但是在程序退出之前,finally从句仍然被执行,把文件关闭

    from: http://www.cnblogs.com/wei-li/archive/2012/03/26/2417314.html

  • 相关阅读:
    LeetCode 623. Add One Row to Tree
    LeetCode 894. All Possible Full Binary Trees
    LeetCode 988. Smallest String Starting From Leaf
    LeetCode 979. Distribute Coins in Binary Tree
    LeetCode 814. Binary Tree Pruning
    LeetCode 951. Flip Equivalent Binary Trees
    LeetCode 426. Convert Binary Search Tree to Sorted Doubly Linked List
    LeetCode 889. Construct Binary Tree from Preorder and Postorder Traversal
    LeetCode 687. Longest Univalue Path
    LeetCode 428. Serialize and Deserialize N-ary Tree
  • 原文地址:https://www.cnblogs.com/GarfieldEr007/p/5280777.html
Copyright © 2011-2022 走看看