• 《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="")
     
  • 相关阅读:
    hdu1875(最小生成树prime)
    hdu1839(最小生成树)
    poj2739(尺取法+质数筛)
    poj2100(尺取法)
    codeforces-div2-449-B
    gym-101350M
    gym-10135I
    gym-101350H
    gym-101350D
    hdu 5569
  • 原文地址:https://www.cnblogs.com/miaoxiaonao/p/8630828.html
Copyright © 2020-2023  润新知