zoukankan      html  css  js  c++  java
  • python 异常处理

    Python顶层处理器默认对异常的处理方式是:1.捕捉异常 2.打印异常 3.程序退出

    异常处理的语句格式:1.捕捉异常 2.打印异常 3.程序正常执行

      

    try:

             raise xxx

             ………

    except:

             ………

    else:

             ………

    finally:

             ………

    try...except...用于捕捉发生的错误

    else 如果try中没有发生异常,将会执行else语句

    finally 在程序返回前执行,无论有没有异常,它总是会被执行

    return 如果finally中有return语句,则执行finally中的return语句返回;

    如果finally中没有return语句,则返回到转入finally之前的代码段中返回。

    处理过程:

    Start

    Error: integer division or modulo by zero

    Try End

    Big End

    1.自定义异常类 FooError,该异常类继承与ValueError

    2.使用raise抛出异常FooError

    3.处理过程

    raise error

    (因为没有使用try except,所以执行10/n会报错)

    4.最终没有打印到End

    混合双打

    处理过程:

    在bar()函数中,我们明明已经捕获了错误,

    但是,打印一个Big Problem!后,又把错误通过raise语句抛出去了,这不有病么?

    语法嵌套

    1.使用了两次try...except...

    处理过程:

    运行结果思考:

    这种错误处理方式不但没病,而且相当常见。捕获错误目的只是记录一下,便于后续追踪。

    但是,由于当前函数不知道应该怎么处理该错误,所以,最恰当的方式是继续往上抛,让顶层调用者去处理。

    好比一个员工处理不了一个问题时,就把问题抛给他的老板,如果他的老板也处理不了,就一直往上抛,最终会抛给CEO去处理。

    知识点:

    raise语句如果不带参数,就会把当前错误原样抛出

    知识点1:

    可以有多个except来捕获不同类型的错误

    知识点2:

    Python所有的错误都是从BaseException类派生的,常见的错误类型和继承关系看这里:

    https://docs.python.org/3/library/exceptions.html#exception-hierarchy

    打印错误信息:

    知识点:

    str(e)和e.message一样返回字符串类型,只给出异常信息,不包括异常信息的类型

    repr(e)给出较全的异常信息,包括异常信息的类型

    traceback获取的信息最全,与python命令行运行程序出现错误信息一致

    sys.exc_info返回三个值,异常类型,引发的实例,traceback对象

    import traceback

    结果:

    函数信号条件和raise

    知识点:

    用户定义异常引发非错误

    异常提供一种方式传达结果信号,不用返回值

    可用于任何无返回警示值以表明成功或者失败的函数

    常用方式

    知识点:

    采用Exception 覆盖全部类型

    可采用repr打印出出错类型

    有返回值的函数,有错没错都要有默认返回值

    结果:

    练习1

    执行过程:

    ValueError: invalid literal for int() with base 10: 'a'

    返回值是2

    练习2

    执行过程:

    ValueError: invalid literal for int() with base 10: 'a'

    finally...

    返回值是1

    知识点是:如果finally中有return语句,则执行finally中的return语句返回;

    如果finally中没有return语句,则返回到转入finally之前的代码段中返回。

    练习3

    def foo():

    try:

    r=10/int('a')

    except ValueError as e:

    print('ValueError:',e)

    return 2

    finally:

    print('finally...')

    return 0

    print foo()

    执行过程:

    ValueError: invalid literal for int() with base 10: 'a'

    finally...

    返回值是2

    练习4

    def foo():

    try:

    r=10/int('1')

    except ValueError as e:

    print('ValueError:',e)

    return 2

    else:

    print('else...')

    return 3

    finally:

    print('finally...')

    print foo()

    执行过程:

    没有异常,执行else语句

    else...

    finally...

    返回值是3

  • 相关阅读:
    Ubuntu 14.04的SWAP 为0
    堆和栈的区别(转过无数次的文章)
    加法乘法判断溢出(转)
    大端格式、小端格式(转)
    Linux 目录操作和4中文件拷贝效率测试
    Linux使用标准IO的调用函数,分3种形式实现
    支持 onload 事件的元素
    $().each() 和 $.each()
    npm install --save 与 npm install --save-dev 的区别
    <!DOCTYPE html>作用
  • 原文地址:https://www.cnblogs.com/mianbaoshu/p/12068752.html
Copyright © 2011-2022 走看看