Python Task 08:异常处理

Python Task 08:异常处理

1.异常

异常 解释
AssertionError 断言语句(assert)失败
AttributeError 尝试访问未知的对象属性
ImportError 导入模块失败的时候
IndexError 引索超出序列的范围
KeyError 字典中查找一个不存在的关键词
MemoryError 内存溢出(可通过删除对象释放内存)
NameError 尝试访问一个不存在的变量
OSError 操作系统产生的异常(如打开一个不存在的文件
OverflowError 数值运算超出最大限制
SyntaxError python的语法错误
TypeError 不同类型的无效操作
ValueError 传入无效的参数
ZeroDivisionError 除数为0

2.异常处理

(1)try-except

  • 首先,执行 try 子句 (try 和 except 关键字之间的(多行)语句)。
  • 如果没有异常发生,则跳过 except 子句并完成 try 语句的执行。
  • 如果在执行try 子句时发生了异常,则跳过该子句中剩下的部分。然后,如果异常的类型和 except 关键字后面的异常匹配,则执行except 子句 ,然后继续执行 try 语句之后的代码。
  • 如果发生的异常和 except 子句中指定的异常不匹配,则将其传递到外部的 try 语句中;如果没有找到处理程序,则它是一个未处理异常,执行将停止并显示如上所示的消息。

eg:Python Task 08:异常处理
Python Task 08:异常处理

  • 一个 try 语句可能包含多个except子句,分别来处理不同的特定的异常。最多只有一个分支会被执行。
    处理程序将只针对对应的try子句中的异常进行处理,而不是其他的 try 的处理程序中的异常。
    Python Task 08:异常处理

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

  • 最后一个except子句可以忽略异常的名称,它将被当作通配符使用。你可以使用这种方法打印一个错误信息,然后再次把异常抛出。
    Python Task 08:异常处理

  • try except语句还有一个可选的else子句,如果使用这个子句,那么必须放在所有的except子句之后。这个子句将在try子句没有发生任何异常的时候执行。
    Python Task 08:异常处理

  • 使用 else 子句比把所有的语句都放在 try 子句里面要好,这样可以避免一些意想不到的、而except又没有捕获的异常。
    异常处理并不仅仅处理那些直接发生在try子句中的异常,而且还能处理子句中调用的函数(甚至间接调用的函数)里抛出的异常。
    Python Task 08:异常处理
    (2) try - finally
    Python Task 08:异常处理
    以上例子不管 try 子句里面有没有发生异常,finally 子句都会执行。

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

3.抛出异常

  • Python 使用 raise 语句抛出一个指定的异常。
  • raise 唯一的一个参数指定了要被抛出的异常。它必须是一个异常的实例或者是异常的类(也就是 Exception的子类)。如果只想知道这是否抛出了一个异常,并不想去处理它,那么一个简单的 raise 语句就可以再次把它抛出。
    Python Task 08:异常处理

参考来源:
https://www.runoob.com/python3/python3-errors-execptions.html
https://mp.weixin.qq.com/s/bOOuSXY1fLOvgOYkEmM13w