美文网首页
python异常处理

python异常处理

作者: 伟大的洪立 | 来源:发表于2018-08-13 18:40 被阅读0次

    错误和异常

    错误---->

    • 语法错误: 自己造孽, 写错代码! 错误也是一种异常;
    • 逻辑错误: 程序运行中, 在某些特定条件下, 不合适的数据引起程序出现错误导致程序崩溃。
    >>> c = int(input("请输入数据"))
    请输入数据a
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: invalid literal for int() with base 10: 'a'
    

    异常----> 执行过程中出现的问题导致程序无法正常执行

    • 程序遇到算法或逻辑问题
    • 运行过程中计算机出现问题(内存不足, 或I/O错误)


      错误与异常的区别

    为什么要处理异常

    当程序在运行过程中,由于用户的误操作或者不合适的数据引发的程序错误,让代码自己处理并保证程序的正常执行。而不至于因为错误导致程序崩溃!提高代码的健壮性!

    异常处理方法

    • 捕获异常
    • 断言处理异常[测试异常信息]

    语法

    try # 尝试, 将可能出现的异常的代码, 包含在try中
    except # 一旦出现异常, 代码就会直接从出现异常的地方跳转到except中执行
    else # 如果try中的代码执行没有异常, 执行完毕后, 就会执行else中的代码
    finally # 不会是否出现异常, 都要在try中执行完成之后执行的代码

    try:
        print('try...')
        r = 10/0
        print('result:', r)
    except ZeroDivisionError as e:
        print('except:', e)
    finally:
        print("finally...")
    print("END")
    ------------------------------------
    try...
    except: division by zero
    finally...
    END
    

    当我们认为某些代码可能会出错时, 就可以用try来运行这段代码,如果执行出错, 则后续代码不会继续执行, 而是直接跳转至错误处理代码, 即except语句模块, 执行完except后,如果有finally语句块, 则执行finally语句块, 至此, 执行完毕。

    处理多个异常

    错误可能有多种,使用不同的except语句块处理。

    
    try:
        print('try...')
        r = 10/int('a')
        print('result:', r)
    except ValueError as e:
        print('ValueError:', e)
    except ZeroDivisionError as e:
        print('ZeroDivisionError:', e)
    finally:
        print('finally...')
    print('END')
    ------------------------------------------
    try...
    ValueError: invalid literal for int() with base 10: 'a'
    finally...
    END
    
    

    使用else

    try:
        print('try...')
        r = 10/int('2')
        print('result:', r)
    except ValueError as e:
        print('ValueError:', e)
    except ZeroDivisionError as e:
        print('ZeroDivisionError:', e)
    else:
        print("no error")
    finally:
        print('finally...')
    print('END')
    --------------------------------------
    try...
    result: 5.0
    no error
    finally...
    END
    

    捕获异常的好处

    可以跨越多层调用, 比如main()调用foo(), foo()调用bar(), 结果bar()出错了, 这时, 只要main()捕获到了, 就可以处理:

    def foo(s):
        return 10/int(s)
    
    def bar(s):
        return foo(s)*2
    
    def main():
        try:
            bar('0')
        except Exception as e:
            print('Error:', e)
        finally:
            print('finally...')
    
    main()
    --------------------------------------
    Error: division by zero
    finally...
    

    也就是说,不需要在每个可能出错的地方去捕获错误,只要在合适的层次去捕获错误就可以了。这样一来,就大大减少了写try...except...finally的麻烦。

    自定义异常

    首先-代码执行过程中,出现了异常【系统标准异常】【信息不是很明白】

    捕获系统异常,创建一个自定义异常

    抛出自定义异常【自定义异常】【信息明确的错误】

    自定义异常的目的:转换异常信息,将不明确的异常信息转换成更加精确的异常信息

    转换异常信息:异常的传递~传递更加明确的异常,给后面的代码进行处理!

    主动抛出异常

    在开发过程中, 主动出现的一种错误, 将错误抛出给程序。
    通过raise关键字, 抛出一个异常

    断言处理异常(调试)

    断言是一句必须等价于布尔真的判定;此外,发生异常也意味着表达式为假.这些工作类似于 C 语言预处理器中 assert 宏,但在 Python 中它们在运行时构建(与之相对的是编译期判别).

    如果刚刚接触断言这个概念,无妨.断言可以简简单单的想象为 raise-if 语句(更准确的说是raise-if-not 语句).测试一个表达式,如果返回值是假,触发异常.

    断言语句等价于这样的 Python 表达式,如果断言成功不采取任何措施(类似语句),否则触发AssertionError(断言错误)的异常.assert 的语法如下:

    assert expression[, arguments]

    Python中何时使用断言
    凡是用print()来辅助查看的地方, 都可以用断言来替代

    def foo(s):
        n = int(s)
        assert n != 0, 'n is zero'
        return 10/n
    
    def main():
        foo('0')
    
    main()
    ----------------------------------------
    Traceback (most recent call last):
      File "异常.py", line 61, in <module>
        main()
      File "异常.py", line 59, in main
        foo('0')
      File "异常.py", line 55, in foo
        assert n != 0, 'n is zero'
    AssertionError: n is zero
    

    assert的意思是, 表达式n != 0应该是True,否则, 根据程序运行的逻辑, 后面的代码肯定出错。
    如果断言失败, assert会抛出AssertionError

    参考博客:http://blog.csdn.net/pipisorry/article/details/21841883

    常见的异常

    所有异常的超类: BaseException
    标准异常的超类: Exception
    常见的异常:


    常见异常

    相关文章

      网友评论

          本文标题:python异常处理

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