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 |