美文网首页
21.python3错误和异常

21.python3错误和异常

作者: dwy_interesting | 来源:发表于2020-05-26 10:50 被阅读0次

    错误

    python有两种错误很容易辨认:语法错误和异常。
    Python assert(断言)用于判断一个表达式,在表达式条件为 false 的时候触发异常

    错误

    语法错误:

    >>>while True print('Hello world')
      File "<stdin>", line 1, in ?
        while True print('Hello world')
                       ^
    SyntaxError: invalid syntax
    

    程序执行过程中,python解释器会检测你的程序是否存在语法错误,如果程序出错python解释器会指出出错的一行,并且在最先找到的 错误的位置标记了一个小小的箭头。这里函数 print() 被检查到有错误,是它前面缺少了一个冒号 :。

    异常

    异常

    例子1:

    >>> 1/0Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ZeroDivisionError: division by zero
    

    在生活中0是不能作为被除数的,程序写的语法可能没问题,但是逻辑上不一定没有问题。

    例子2:

    >>> 4 + spam*3             
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    NameError: name 'spam' is not defined
    

    spam 未定义,触发异常

    例子3:

    >>> '2' + 2              
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    TypeError: Can't convert 'int' object to str implicitly
    

    int 不能与 str 相加,触发异常

    异常以不同的类型出现,这些类型都作为信息的一部分打印出来: 例子中的类型有 ZeroDivisionError,NameError 和 TypeError。

    异常处理

    try/except
    捕捉异常可以使用try/except语句。
    try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理。
    如果你不想在异常发生时结束你的程序,只需在try里捕获它。
    例子:

    try:
        print(2/0)
    except ZeroDivisionError:
        print( '除数不能为0')
    

    捕捉多个异常

    在一个except语句只捕捉其后声明的异常类型,如果可能会抛出的是其他类型的异常就需要再增加一个except语句了,或者也可以指定一个更通用的异常类型比如:Exception,如下:

    try:
        print( 2/'0')
    except ZeroDivisionError:
        print('除数不能为0')
    except Exception:
        print('其他类型异常')
    

    为了捕获多个异常,除了声明多个except语句之外,还可以在一个except语句之后将多个异常作为元组列出来即可:

    try:
        print(2/'0')
    except (ZeroDivisionError,Exception):
        print( '发生了一个异常')
    

    获取异常信息--as
    每个异常都会有一些异常信息,一般情况下我们应该把这些异常信息记录下来:

    try:
        print( 2/'0')
    except (ZeroDivisionError,Exception) as e:
        # unsupported operand type(s) for /: 'int' and 'str'
        print( e)
    

    抛出异常

    Python中的raise 关键字用于引发一个异常,raise关键字后面跟的是一个通用的异常类型(Exception),一般来说异常类型越详细越好。

    def ThorwErr():
      raise Exception("抛出一个异常")
     
    # Exception: 抛出一个异常
    ThorwErr()
    

    Python在exceptions模块内建了很多的异常类型,通过使用dir函数来查看exceptions中的异常类型,如下:

    import exceptions
     
    # 结果是:['ArithmeticError', 'AssertionError'.....]
    print dir(exceptions)
    

    finally子句

    finally子句和try子句联合使用,但是他和except语句不同,finally不管try子句内部是否有异常发生,都会执行finally子句内的代码。所有一般情况下,finally自己常常用于关闭文件或者在Socket中。

    try:
        print( 2/'0')
    except (ZeroDivisionError,Exception):
        print( '发生了一个异常')
    finally:
        print('不管是否发生异常都执行')
    

    自定义异常类型
    Python中也可以自定义自己的特殊类型的异常,只需要从Exception类继承(直接或间接)即可:

    class SomeCustomException(Exception):
        def __init__(self, arg):
            self.args = arg
    

    使用:

    try:
        raise SomeCustomException("exception info")
    except SomeCustomException as e:
        print ( e.args )
    

    相关文章

      网友评论

          本文标题:21.python3错误和异常

          本文链接:https://www.haomeiwen.com/subject/wyjkwhtx.html