Python异常处理总结

一、何谓异常处理

  在我们调试程序时,经常不可避免地出现意料之外的情况,导致程序不得不停止运行,然后提示大堆提示信息,大多是这种情况都是由异常引起的。异常的出现一方面是因为写代码时粗心导致的语法错误,这种错误在程序编译时就可以发现;另一方面也可能是因为程序逻辑错误,这种错误往往是不可避免地,只能通过异常处理来防止程序退出。

二、异常类型

  Python自带的异常处理机制非常强大,提供了很多内置异常类,可向用户准确反馈出错信息。Python是面向对象语言,认为一切皆对象,所以异常也是对象。Python异常处理机制中的BaseException是所有内置异常的基类,但用户定义的类并不直接继承BaseException,所有的异常类都是从Exception继承,且都在exceptions模块中定义。Python自动将所有异常名称放在内建命名空间中,所以程序不必导入exceptions模块即可使用异常。

  Python内置异常类继承层次结构如下:

BaseException  # 所有异常的基类

 -- SystemExit  # 解释器请求退出

 -- KeyboardInterrupt  # 用户中断执行(通常是输入^C)

 -- GeneratorExit  # 生成器(generator)发生异常来通知退出

 -- Exception  # 常规异常的基类

      -- StopIteration  # 迭代器没有更多的值

      -- StopAsyncIteration  # 必须通过异步迭代器对象的__anext__()方法引发以停止迭代

      -- ArithmeticError  # 各种算术错误引发的内置异常的基类

      |    -- FloatingPointError  # 浮点计算错误

      |    -- OverflowError  # 数值运算结果太大无法表示

      |    -- ZeroDivisionError  # 除(或取模)零 (所有数据类型)

      -- AssertionError  # 当assert语句失败时引发

      -- AttributeError  # 属性引用或赋值失败

      -- BufferError  # 无法执行与缓冲区相关的操作时引发

      -- EOFError  # 当input()函数在没有读取任何数据的情况下达到文件结束条件(EOF)时引发

      -- ImportError  # 导入模块/对象失败

      |    -- ModuleNotFoundError  # 无法找到模块或在在sys.modules中找到None

      -- LookupError  # 映射或序列上使用的键或索引无效时引发的异常的基类

      |    -- IndexError  # 序列中没有此索引(index)

      |    -- KeyError  # 映射中没有这个键

      -- MemoryError  # 内存溢出错误(对于Python 解释器不是致命的)

      -- NameError  # 未声明/初始化对象 (没有属性)

      |    -- UnboundLocalError  # 访问未初始化的本地变量

      -- OSError  # 操作系统错误,EnvironmentError,IOError,WindowsError,socket.error,select.error和mmap.error已合并到OSError中,构造函数可能返回子类

      |    -- BlockingIOError  # 操作将阻塞对象(e.g. socket)设置为非阻塞操作

      |    -- ChildProcessError  # 在子进程上的操作失败

      |    -- ConnectionError  # 与连接相关的异常的基类

      |    |    -- BrokenPipeError  # 另一端关闭时尝试写入管道或试图在已关闭写入的套接字上写入

      |    |    -- ConnectionAbortedError  # 连接尝试被对等方中止

      |    |    -- ConnectionRefusedError  # 连接尝试被对等方拒绝

      |    |    -- ConnectionResetError    # 连接由对等方重置

      |    -- FileExistsError  # 创建已存在的文件或目录

      |    -- FileNotFoundError  # 请求不存在的文件或目录

      |    -- InterruptedError  # 系统调用被输入信号中断

      |    -- IsADirectoryError  # 在目录上请求文件操作(例如 os.remove())

      |    -- NotADirectoryError  # 在不是目录的事物上请求目录操作(例如 os.listdir())

      |    -- PermissionError  # 尝试在没有足够访问权限的情况下运行操作

      |    -- ProcessLookupError  # 给定进程不存在

      |    -- TimeoutError  # 系统函数在系统级别超时

      -- ReferenceError  # weakref.proxy()函数创建的弱引用试图访问已经垃圾回收了的对象

      -- RuntimeError  # 在检测到不属于任何其他类别的错误时触发

      |    -- NotImplementedError  # 在用户定义的基类中,抽象方法要求派生类重写该方法或者正在开发的类指示仍然需要添加实际实现

      |    -- RecursionError  # 解释器检测到超出最大递归深度

      -- SyntaxError  # Python 语法错误

      |    -- IndentationError  # 缩进错误

      |         -- TabError  # Tab和空格混用

      -- SystemError  # 解释器发现内部错误

      -- TypeError  # 操作或函数应用于不适当类型的对象

      -- ValueError  # 操作或函数接收到具有正确类型但值不合适的参数

      |    -- UnicodeError  # 发生与Unicode相关的编码或解码错误

      |         -- UnicodeDecodeError  # Unicode解码错误

      |         -- UnicodeEncodeError  # Unicode编码错误

      |         -- UnicodeTranslateError  # Unicode转码错误

      -- Warning  # 警告的基类

           -- DeprecationWarning  # 有关已弃用功能的警告的基类

           -- PendingDeprecationWarning  # 有关不推荐使用功能的警告的基类

           -- RuntimeWarning  # 有关可疑的运行时行为的警告的基类

           -- SyntaxWarning  # 关于可疑语法警告的基类

           -- UserWarning  # 用户代码生成警告的基类

           -- FutureWarning  # 有关已弃用功能的警告的基类

           -- ImportWarning  # 关于模块导入时可能出错的警告的基类

           -- UnicodeWarning  # 与Unicode相关的警告的基类

           -- BytesWarning  # 与bytes和bytearray相关的警告的基类

           -- ResourceWarning  # 与资源使用相关的警告的基类。被默认警告过滤器忽略。

三、异常捕获与处理

语法: try:  ...   except [异常名] as e: ...

示例:

name = ["alex","jack"]
data = {}
try:
    a=5
    f = open("123","r")   #会触发异常Exception,这个包括了所有个异常
    name[3]         # 会触发异常indexError
    data["name"]  # 会触发异常KeyError
except KeyError as e:
    print("没有此信息",e)
except IndexError as e:
    print("列表索引超出范围",e)
except Exception as e:
    print("未知错误",e)
else: # 一切正常的情况下会执行后面的语句
    print("OK")
finally:
    print("不管有没有错误,都会执行的语句")
#输出:
未知错误 [Errno 2] No such file or directory: ‘123‘
不管有没有错误,都会执行的语句

#上面的输出结果是因为,按照执行的顺序,首先执行打开文件出现异常,后面的语句没有被执行的机会。
想要一条语句抓住两种错误,可以这样写:
try:
    name[3]
    data["name"]
except (KeyError,IndexError) as e:
    print("没有此信息",e)

需要注意的是:

  • try - except虽然结构简单,但可能捕获与程序无关、意料之外的系统异常,而且可能意外拦截其他处理器的异常。例如,在Python中,即表示系统离开调用(sys.exit())也会出发异常,然而这种异常我们通常不需要捕获。所以,这种结构尽量避免使用,而使用 <try: ... except [异常名] as e: ...>这种结构。
  • Exception类是所有Python异常类的父类,所以except Exception将可以捕获任何异常,换句话说,它是万能异常处理句式。
  • 有一种错误没办法抓住:缩进错误,例如:
try:
    name1 = 10
     b = 20
except Exception as e:
    print("错误!")

# output:
 File "F:/Python Files/Learning Log/day7/异常处理.py", line 44
    b = 20
    ^
IndentationError: unexpected indent

四、raise(主动抛出异常)

  有时候,异常可以作为代码运行的标志,通过主动触发异常可以改变代码的运行路线,从而提高代码健壮性。主动触发异常需使用raise关键字,其语法结构如下:

raise [Exception [, args [, traceback]]]

示例:

def fun(x , y):
    try:
        print(‘fun()方法开始执行……‘)
        if isinstance(x,int) and isinstance(y,int):
            return x+y
        else:
            raise TypeError(‘类型错误‘)
    except Exception as e:
        print(e)
    finally:
        print(‘fun()方法执行结束……‘)

fun(2 , ‘3‘)

# output:
fun()方法开始执行……
类型错误
fun()方法执行结束……

五、assert(断言)

根据assert后面的表达式的真假来控制程序流。 asset语法结构如下:

assert expression,‘information‘

  若为expression结果为True,则往下执行。若为False,则中断程序并调用默认的异常处理器抛出AssertionError异常,同时输出指定的提示信息。

class A(object):
    def __init__(self,name):
        self.name = name
a = A("Alex")
try:
    assert type(a.name) is str # 意为:断定A.name的类型是字符串
except AssertionError:
    print("is not str")

断言的作用是:可以做一些检查,增强安全性

六、with/as上下文管理器

  with/as语句通常是作为try/finally语句的替代方案,不过with/as更加优雅。在有一些任务中,可能事先需要设置,然后不管在任务过程中是否顺利(有无异常抛出),最后后做清理工作。对于这种场景, with/as语句提供了一种非常方便的处理方式。一个很好的例子是文件处理,你需要获取一个文件句柄,从文件中读写数据,但不管读写数据是否有异常发生,最后都要关闭文件句柄。

with/as语句的基本格式如下:

with expression [as variable] :
    with-block

在这里的expression会返回一个对象,as子句是可选的,当存在as子句时,expression返回的对象会赋值给variable。

使用with/as语句将一段字符串写入文件:

with open(‘data.txt‘ , ‘w‘) as myfile:
    myfile.write(‘123456789‘)
         不适用with/as语句,如果要实现同样的效果,只能这么写:
try:
    myfile = open(‘data.txt‘ , ‘w‘)
    myfile.write(‘123456789‘)
except Exception as e:
    print(e)
finally:
    myfile.close()

七、自定义异常类

如果Python提供的内置异常内不满足使用要求,那么,可以自定义一个异常类,自定义异常类必须继承Exception类。

class AlexException(Exception):
    def __init__(self,msg):
        self.message = msg

try:
    raise AlexException("数据库连不上") # raise 主动触发异常
except AlexException as e:
    print(e)

# output:
数据库连不上

需要注意:

  • 自定义的异常不会自动触发,所以需要主动触发。会自动触发的都是标准的异常
  • 自定义的异常不能和原有的异常重名

八、总结

Python异常处理机制总结:

  1. Python异常处理的常用内置类
  2. 异常捕获/处理句式结构
  3. 主动触发异常,断言
  4. with上下文管理协议
  5. 自定义异常类

原文地址:https://www.cnblogs.com/V587Chinese/p/10159505.html

时间: 2024-11-17 07:31:34

Python异常处理总结的相关文章

Python 异常处理

Python 异常处理 python提供了两个非常重要的功能来处理python程序在运行中出现的异常和错误.你可以使用该功能来调试python程序. 异常处理: 本站Python教程会具体介绍. 断言(Assertions):本站Python教程会具体介绍. python标准异常 异常名称 描述 BaseException 所有异常的基类 SystemExit 解释器请求退出 KeyboardInterrupt 用户中断执行(通常是输入^C) Exception 常规错误的基类 StopIter

Python 异常处理--raise函数用法

raise语句手工引发一个异常: 1 "raise" [expression ["," expression ["," expression]]] 在Python中,要想引发异常,最简单的形式就是输入关键字raise,后跟要引发的异常的名称.异常名称标识出具体的类: Python异常处理是那些类的对象.执行raise语句时,Python会创建指定的异常类的一个对象.raise语句还可指定对异常对象进行初始化的参数.为此,请在异常类的名称后添加一个

十一、Python异常处理

Python异常处理 异常抛出机制,为程序开发人员提供了一种在运行时发现错误,进行回复处理,然后继续执行的能力 #!/usr/bin/python try: open('abc.txt') except IOError,msg: pass 抛出机制: 如果在运行时发生异常的话,解释器会查找相应的处理语句(称为handler) 要是在当前函数力没有找到的话,它会将异常传递给上层的调用函数,看看那里能不能处理 如果在最外层(全局"main")还是没有找到的话,解释器就会退出,同时打印出tr

第十节:python异常处理、类

python个人笔记,纯属方便查询. -----------------------python异常处理------------------------- try:         name=['a','b','c']         name[3] except IndexError:         print 'you list is out of range.........' 意思是让原本的错误改成自己想要的错误提示. try:         name=['a','b','c']  

python异常处理和面向对象编程总结

异常处理和面向对象编程,是python编程中,比较重要的基础.在实际生产编程设计和开发中,异常处理和面向读象都是必须在设计和开发过程中充分考虑的.    对于python开发和面向对象这两部分基础,用一个python程序进行封装说明,结果如下: #!/usr/bin/env python # _*_ coding:utf-8 _*_ ################# #异常处理 ################# print ''' 异常处理是用于处理软件或信息系统中出现的异常状况的一种机制,

Python异常处理与程序调试

Python异常处理与程序调试 Python提供了强大的异常处理机制,通过捕获异常可以提高程序的健壮性.异常处理还具有释放对象,中止循环的运行等作用.在程序运行的过程中,如果发生了错误,可以返回事先约定的一个错误代码. "try...except"语句 用于处理问题语句,捕获可能存在的异常.try子句的代码块中放置的可能出现异常的语句,except子句中的代码用于处理异常.当异常出现时,Python会自动生成一个异常对象. >>> try: ... f = open(

Python异常处理

1.异常概述 (1)异常:Python用异常对象来表示异常情况,遇到错误后,会引发异常,如果异常对象未被处理捕捉,程序就会用所谓的回溯终止执行 (2)异常处理:程序出现bug时不将错误信息显示给用户,而是现实一个提示的页面 2.常见python 异常: (1)AttributeError:试图访问一个对象没有的属性,比如foo.x,但是foo没有属性x (2)IOError:输入/输出异常:基本上是无法打开文件 (3)ImportError:无法引入模块或包:基本上是路径问题或名称错误 (4)I

第七章 Python异常处理

什么是异常? 顾名思义,异常就是程序因为某种原因无法正常工作了,比如缩进错误.缺少软件包.环境错误.连接超时等等都会引发异常.一个健壮的程序应该把所能预知的异常都应做相应的处理,应对一些简单的异常情况,使得更好的保证程序长时间运行.即使出了问题,也可让维护者一眼看出问题所在.因此本章节讲解的就是怎么处理异常,让你的程序更加健壮. 7.1 捕捉异常语法 try...except... try:      expression except [Except Type]:      expressio

【代码学习】PYTHON 异常处理

一.什么是异常 在程序执行过程中可能会影响程序的正常执行,一般情况下,在python无法正常处理程序时就会发生一个异常 当python脚本发生异常时我们需要捕获处理他,否则程序会终止执行 二.异常处理 捕捉异常可以使用try/except语句. try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理. 如果你不想在异常发生时结束你的程序,只需在try里捕获它. 三.捕获异常 try的工作原理是,当开始一个try语句后,python就在当前程序的上下文中作标