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

原文地址:https://www.cnblogs.com/mianbaoshu/p/12068752.html