zoukankan      html  css  js  c++  java
  • 《The Python Tutorial》——Errors and Exceptions 阅读笔记

    Errors and Exceptions

    官方文档:https://docs.python.org/3.5/tutorial/errors.html

    python中所有的异常都继承自BaseException类。

    1.1 Syntax Errors

    1.2 Exceptions

    https://docs.python.org/3.5/library/exceptions.html

     

    1.3 Handling Exception

    使用try语句:

    >>> while True:
    ...     try:
    ...         x = int(input("Please enter a number: "))
    ...         break
    ...     except ValueError:
    ...         print("Oops!  That was no valid number.  Try again...")
    except也可以使用元组:
    ... except (RuntimeError, TypeError, NameError):
    ...     pass
    最后一个except可以省略异常名exception name,此时就跟通配符一样的作用(包含所有其他的异常)。
    基于此,可以在最后一句except中打印异常提示并可重新raise对应的异常:
    import sys
    
    try:
        f = open('myfile.txt')
        s = f.readline()
        i = int(s.strip())
    except OSError as err:
        print("OS error: {0}".format(err))
    except ValueError:
        print("Could not convert data to an integer.")
    except:
        print("Unexpected error:", sys.exc_info()[0])
        raise
    还可以在try...except语句后使用else语句,适用于try后没发生相应异常又需要继续完成某种操作的情况:
    for arg in sys.argv[1:]:
        try:
            f = open(arg, 'r')
        except IOError:
            print('cannot open', arg)
        else:
            print(arg, 'has', len(f.readlines()), 'lines')
            f.close()
    异常handler不仅能够捕捉try语句中的异常,也可以捕捉try语句内被调用函数的异常(嵌套的非直接调用的函数产生的异常也行):
    >>> def this_fails():
    ...     x = 1/0
    ...
    >>> try:
    ...     this_fails()
    ... except ZeroDivisionError as err:
    ...     print('Handling run-time error:', err)
    ...
    Handling run-time error: division by zero

    1.4 Raising Exceptions

    raise语句可以人为的让某个异常"发生":

    >>> raise NameError('HiThere')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    NameError: HiThere

    raise的参数只有一个,即为一个异常的实例名或异常类名(当然,这个异常也是继承自Exception类的),
    其实,当一个异常类被raise的时候,会自动调用它的构造函数“悄悄的”进行实例化:
    raise ValueError  # shorthand for 'raise ValueError()'

    1.5 User-defined Exception

    所有异常类都继承自Exception类。
    通常的做法是先建立一个继承自Exception的Eroor,再根据不同的异常建立不同的异常类(继承Eroor):
    class Error(Exception):
        """Base class for exceptions in this module."""
        pass
    
    class InputError(Error):
        """Exception raised for errors in the input.
    
        Attributes:
            expression -- input expression in which the error occurred
            message -- explanation of the error
        """
    
        def __init__(self, expression, message):
            self.expression = expression
            self.message = message
    
    class TransitionError(Error):
        """Raised when an operation attempts a state transition that's not
        allowed.
    
        Attributes:
            previous -- state at beginning of transition
            next -- attempted new state
            message -- explanation of why the specific transition is not allowed
        """
    
        def __init__(self, previous, next, message):
            self.previous = previous
            self.next = next
            self.message = message

    1.6 Defineing Clean-up Actions

    使用finally语句:
    >>> try:
    ...     raise KeyboardInterrupt
    ... finally:
    ...     print('Goodbye, world!')
    ...
    Goodbye, world!
    KeyboardInterrupt
    Traceback (most recent call last):
      File "<stdin>", line 2, in <module>

    1.7 Predefined Clean-up Actions

    with语句的使用:
    with open("myfile.txt") as f:
        for line in f:
            print(line, end="")
     
  • 相关阅读:
    Windows安装Oracle
    MySQL索引的创建和使用
    使用TensorFlow进行中文情感分析
    gensim库word2vec使用
    软件测试理论
    产品经理
    产品经理
    产品经理
    职业规划及核心竞争力
    项目管理
  • 原文地址:https://www.cnblogs.com/miaoxiaonao/p/8630828.html
Copyright © 2011-2022 走看看