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

        在python开发中,代码书写时难免有疏忽或者意向不到的bug,导致程序run的过程中有可能会直接崩溃;然后对于程序猿而言,程序因bug崩溃是家常便饭,为了增加程序的健壮性,防止程序崩溃,我们可以对程序的有可能发生崩溃的代码增加异常处理,以达到程序稳健运行的目的。

    bug

     

    一.异常的概念

        一般情况,python无法正常处理程序时,就是会产生异常,举个例子:

        1.大家都知道分母不能为0,如果分母为0,程序必然崩溃;

    x = 3/0
     
    程序崩溃/报错:ZeroDivisionError: division by zero

     

        2.假如 python文件读写 中,我们讲解了文件的读写操作,如果我们对一个不存在的文件读取内容,程序必然也会崩溃;

    # 读取123.txt文件,实际上该文件并不存在
    fp =open("123.txt","r")
     
    程序崩溃/报错:FileNotFoundError: [Errno 2] No such file or directory: '123.txt'

     

        对于以上的各种异常情况,我们可以通过 try…except…解决,那么具体有哪些异常能捕获呢?如下所示:

        1.BaseException — 所有异常的基类

        2.SystemExit — 解释器请求退出

        3.KeyboardInterrupt — 用户中断执行(通常是输入^C)

        4.Exception — 常规错误的基类

        5.StopIteration — 迭代器没有更多的值

        6.GeneratorExit — 生成器(generator)发生异常来通知退出

        7.StandardError — 所有的内建标准异常的基类

        8.ArithmeticError — 所有数值计算错误的基类

        9.FloatingPointError — 浮点计算错误

        10.OverflowError — 数值运算超出最大限制

        11.ZeroDivisionError — 除(或取模)零 (所有数据类型)

        12.AssertionError — 断言语句失败

        13.AttributeError — 对象没有这个属性

        14.EOFError — 没有内建输入,到达EOF 标记

        15.EnvironmentError — 操作系统错误的基类

        16.IOError — 输入/输出操作失败

        17.OSError — 操作系统错误

        18.WindowsError — 系统调用失败

        19.ImportError — 导入模块/对象失败

        20.LookupError — 无效数据查询的基类

        21.IndexError — 列中没有此索引(index)

        22.KeyError — 映射中没有这个键

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

        24.NameError — 未声明/初始化对象 (没有属性)

        25.UnboundLocalError — 访问未初始化的本地变量

        26.ReferenceError — 弱引用(Weak reference)试图访问已经垃圾回收了的对象

        27.RuntimeError — 一般的运行时错误

        28.NotImplementedError — 尚未实现的方法

        29.SyntaxError — Python 语法错误

        30.IndentationError — 缩进错误

        31.TabError —  Tab 和空格混用

        32.SystemError — 一般的解释器系统错误

        33.TypeError — 对类型无效的操作

        34.ValueError — 传入无效的参数

        35.UnicodeError — Unicode 相关的错误

        36.UnicodeDecodeError — Unicode 解码时的错误

        37.UnicodeEncodeError — Unicode 编码时错误

        38.UnicodeTranslateError — Unicode 转换时错误

        39.Warning — 警告的基类

        40.DeprecationWarning — 关于被弃用的特征的警告

        41.FutureWarning — 关于构造将来语义会有改变的警告

        42.OverflowWarning — 旧的关于自动提升为长整型(long)的警告

        43.PendingDeprecationWarning — 关于特性将会被废弃的警告

        44.RuntimeWarning — 可疑的运行时行为(runtime behavior)的警告

        45.SyntaxWarning — 可疑的语法的警告

        46.UserWarning — 用户代码生成的警告

     

    bug

    二.捕获异常方式

        1.捕获所有异常

    try:
        <代码>
    except:
        print("异常说明")

        示例代码:

    # !usr/bin/env python
    # -*- coding:utf-8 _*-
    """
    @Author:何以解忧
    @Blog(个人博客地址): shuopython.com
    @WeChat Official Account(微信公众号):猿说python
    @Github:www.github.com
     
    @File:try_except.py
    @Time:2019/10/9 21:27
     
    @Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
    """
     
    try:
        x = 3 / 0 # 程序出现异常,不会继续执行后面的代码
        print("hello world")
    except:
        print("异常说明:分母不能为0")
     
    print("程序正常结束")

        输出结果:

    异常说明:分母不能为0
    程序正常结束

     

        2.捕获指定异常

    try:
        < 语句 >
    except < 异常名 >:
        print('异常说明')

        示例代码:

    try:
        fp = open("123.txt","r") # 程序出现异常,不会继续执行后面的代码
        print("hello world")
        fp.close()
    except IOError:
        print("异常说明:文件读取失败")
     
    print("程序正常结束")

        输出结果:

    异常说明:文件读取失败
    程序正常结束

     

        3.捕获多个异常

    try:
        < 语句 >
    except < 异常名1 >:
        print('异常说明1')
    except < 异常名2 >:
        print('异常说明2')
    except < 异常名3 >:
        print('异常说明3')

        该种异常处理语法的规则是:

        a.执行try下的语句,如果引发异常,则执行过程会跳到第一个except语句。

        b.如果第一个except中定义的异常名与引发的异常匹配,则执行该except中的语句。

        c.如果引发的异常不匹配第一个except,则会搜索第二个except,允许编写的except数量没有限制。

        d.如果所有的except都不匹配,则异常会传递到下一个调用本代码的最高层try代码中。

        示例代码:

    try:
        fp = open("123.txt","r") # 程序出现异常,不会继续执行后面的代码
        print("hello world")
        fp.close()
    except GeneratorExit:
        print("异常说明:GeneratorExit")
    except FloatingPointError:
        print("异常说明:FloatingPointError")
    except OverflowError:
        print("异常说明:OverflowError")
    except ZeroDivisionError:
        print("异常说明:ZeroDivisionError")
    except IOError:
        print("异常说明:IOError")
     
    print("程序正常结束")

        输出结果:

    异常说明:IOError
    程序正常结束

     

    4.万能的异常捕获

    try:
        < 语句 >
    except Exception as e: # 自动识别异常信息,并将异常信息保存在e中
        print('异常说明:',e)

    示例代码:

    try:
        fp = open("python.txt","r") # 程序出现异常,不会继续执行后面的代码
        print("hello world")
        fp.close()
    except Exception as e:
        print("异常说明:",e)
     
    print("程序正常结束")

    输出结果:

    异常说明: [Errno 2] No such file or directory: 'python.txt'
    程序正常结束

     

    异常

     

    5.异常中的 else

        如果判断完没有异常之后还想做其他事,就可以使用下面这样的else语句,注意:是在try中没有异常情况下,才会执行else之后的代码。

    try:
        < 语句 >
    except < 异常名1 >:
        print('异常说明1')
    except < 异常名2 >:
        print('异常说明2')
    else:
        < 语句 >  # try语句中没有异常则执行此段代码

        示例代码:

    try:
        print("hello world")
    except GeneratorExit:
        print("异常说明:GeneratorExit")
    except FloatingPointError:
        print("异常说明:FloatingPointError")
    except OverflowError:
        print("异常说明:OverflowError")
    except ZeroDivisionError:
        print("异常说明:ZeroDivisionError")
    else:
        print("i love you")
     
    print("程序正常结束")

         输出结果:

    hello world
    i love you
    程序正常结束

     

    6.异常中的finally

        try…finally…语句无论是否发生异常都将会执行最后的代码。

    try:
        < 语句 >
    finally:
        < 语句 >

    示例代码:

    try:
        fp = open("python.txt","r") # 程序出现异常,不会继续执行后面的代码
        print("hello world")
        fp.close()
    except Exception as e:
        print("异常说明:",e)
    finally:
        print("finally") # 无论是否发生异常都将会执行最后的代码
     
    print("程序正常结束")

         输出结果:

    异常说明: [Errno 2] No such file or directory: 'python.txt'
    finally
    程序正常结束

     

    7.raise主动触发异常

        可以使用raise语句自己触发异常,语法如下:

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

        语句中 Exception 是异常的类型(例如,IOError )参数标准异常中任一种,args 是自已提供的异常参数。最后一个参数是可选的(在实践中很少使用),如果存在,是跟踪异常对象;示例代码如下:

    try:
        raise Exception("raise Exception!")  # 触发异常后,后面的代码就不会再执行
        print("hello world")
    except Exception as e:
        print(e)
    finally:
        print("OK")

        输出结果:

    raise Exception!
    OK

    抠鼻子

     

    四.重点总结

        在python开发中,为了增加程序的健壮性,异常处理try…except…是必须掌握的内容.

     

    猜你喜欢:

        1.python文件读写操作

        2.python内置函数input/eval

     

        转载请注明:猿说Python » python异常处理

     

    技术交流、商务合作请直接联系博主
    扫码或搜索:猿说python
    python教程公众号
    猿说python
    微信公众号 扫一扫关注
  • 相关阅读:
    Mac安装LightGBM
    用于视频超分辨率的可变形三维卷积
    ORB-SLAM3 单目地图初始化(终结篇)
    重用地图的单目视觉惯导SLAM系统
    2020,我的秋招感悟!
    超详细解读ORB-SLAM3单目初始化(下篇)
    基于改进的点对特征的6D位姿估计
    深入研究自监督单目深度估计:Monodepth2
    ORB-SLAM3 细读单目初始化过程(上)
    基于视觉和惯性传感器的移动机器人手遥操作系统
  • 原文地址:https://www.cnblogs.com/shuopython/p/11914095.html
Copyright © 2011-2022 走看看