zoukankan      html  css  js  c++  java
  • 2.3 python学习笔记

    13)错误和异常

    1. 异常

    AttributeError:属性错误,特性引用和赋值失败时会引发属性错误(访问未知对象属性)

    NameError:试图访问的变量名不存在

    SyntaxError:语法错误,代码形式错误

    Exception:所有异常的基类,因为所有python异常类都是基类Exception的其中一员,异常都是从基类Exception继承的,并且都在exceptions python 模块中定义。

    IOErrorpython ioerror,一般常见于打开不存在文件时会引发IOError错误,也可以解理为输出输入错误

    KeyError:使用了映射中不存在的关键字(键)时引发的关键字错误(字典关键字不存在)

    IndexError:索引错误,使用的索引不存在,常索引超出序列范围,什么是索引python list index

    TypeError:类型错误,内建操作或是函数应于在了错误类型的对象时会引发类型错误

    ZeroDivisonError:除数为0,在用除法操作时,第二个参数为0时引发了该错误

    ValueError:值错误,传给对象的参数类型不正确,像是给int()函数传入了字符串数据类型的参数。

    AssertionError:断言错误

    LookupError:键、值不存在引发的异常,LookupError异常是IndexError、KeyError的基类, 如果你不确定数据类型是字典还是列表时,可以用LookupError捕获此异常。

    StandardError: 标准异常,错误检测与异常处理区别在于:错误检测是在正常的程序流中,处理不可预见问题的代码,例如一个调用操作未能成功结束。

    https://www.iplaypy.com/jinjie/jj158.html

    2. 错误处理

    try-except-else-finally语句

     

    一个 try 语句可能包含多个except子句,分别来处理不同的特定的异常。最多只有一个分支会被执行。

    处理程序将只针对对应的 try 子句中的异常进行处理,而不是其他的 try 的处理程序中的异常。

    一个except子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组,例如:

    except (RuntimeError, TypeError, NameError):
         pass

    例子:

    try:
        x = int(input("请输入一个数字: "))
    except NameError as nam:
        print("Wrong!", nam)
    except ValueError as val:
        print(("请输入数字!"), val)
    else:
        try:
            y = int(input("在输入一个数字:"))
        except ValueError as vals:
            print(("请输入数字!"), vals)
        else:
            print('输出:',x + y)
    finally:
        print('反正会输出的,管他那么多')

    注1:如果一个异常没有与任何的 except 匹配,那么这个异常将会传递给上层的 try 中,如果没有找到处理程序,则它是一个 未处理异常,执行将停止并显示如上所示的消息。

    # err.py:
    def foo(s):
        return 10 / int(s)
    
    def bar(s):
        return foo(s) * 2
    
    def main():
        bar('0')
    
    main()
    
    ##执行,结果如下: $ python3 err.py Traceback (most recent call last): File
    "err.py", line 11, in <module> #错误位置 main() File "err.py", line 9, in main #错误位置 bar('0') File "err.py", line 6, in bar #错误位置 return foo(s) * 2 File "err.py", line 3, in foo #错误位置 return 10 / int(s) ZeroDivisionError: division by zero

    注2: 如果一个异常在 try 子句里(或者在 except 和 else 子句里)被抛出,而又没有任何的 except 把它截住,那么这个异常会在 finally 子句执行后被抛出。

    3. 记录错误

    如果不捕获错误,自然可以让Python解释器来打印出错误堆栈,但程序也被结束了。既然我们能捕获错误,就可以把错误堆栈打印出来,然后分析错误原因,同时,让程序继续执行下去。

    Python内置的logging模块可以非常容易地记录错误信息:

    # err_logging.py
    
    import logging
    
    def foo(s):
        return 10 / int(s)
    
    def bar(s):
        return foo(s) * 2
    
    def main():
        try:
            bar('0')
        except Exception as e:
            logging.exception(e)
    main()
    print('END')

    同样是出错,但程序打印完错误信息后会继续执行,并正常退出:

    $ python3 err_logging.py
    ERROR:root:division by zero
    Traceback (most recent call last):
      File "err_logging.py", line 13, in main
        bar('0')
      File "err_logging.py", line 9, in bar
        return foo(s) * 2
      File "err_logging.py", line 6, in foo
        return 10 / int(s)
    ZeroDivisionError: division by zero
    END

    4. 抛出错误

    Python 使用 raise 语句抛出一个指定的异常。

    raise语法格式如下:

    raise [Exception [, args [, traceback]]]

     

     5.  用户定义异常

     

    6. 断言

    凡是用print()来辅助查看的地方,都可以用断言(assert)来替代

     

     语法格式

    assert expression [, arguments]  ##[]表示可选参数 可以是字符串

    例如:

    >>> assert True     # 条件为 true 正常执行
    >>> assert False    # 条件为 false 触发异常
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AssertionError
    >>> assert 1==1    # 条件为 true 正常执行
    >>> assert 1==2    # 条件为 false 触发异常
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AssertionError
    
    >>> assert 1==2, '1 不等于 2'
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AssertionError: 1 不等于 2

    注: 启动Python解释器时可以用-O参数来关闭assert:,断言的开关“-O”是英文大写字母O,不是数字0。

     

  • 相关阅读:
    NSURLSession实现文件上传
    JS中如何判断null、undefined与NaN
    jquery
    url操作等
    设计模式
    javaScript类型转换
    jQuery.noop
    JavaScript严谨模式(Strict Mode)提升开发效率和质量
    Data URI
    e.target e.currenttarget
  • 原文地址:https://www.cnblogs.com/shish/p/12255203.html
Copyright © 2011-2022 走看看