zoukankan      html  css  js  c++  java
  • Python学习笔记十八_异常处理

      在程序运行过程中,总会遇到各种各样的错误。程序一旦出错,就停止运行了。为了让程序能够正常运行完,这时候就需要捕捉异常了。通过对捕捉到的异常做对应的处理,来保证程序正常运行。

    一、捕捉单个异常

    先来构造一个除数为0的异常

    def cal (a,b):
        res = a/b
        return res
    print(cal(5,1))#调用,没有错误,结果是5.0
    print(cal(5,0))#再次调用,被除数不能为0,下面报了一堆错,程序停止运行了
    # ZeroDivisionError: division by zero

    当除数为0时,我们就需要捕捉异常,并提示用户传入的参数不对,重新传入。

    捕捉异常使用try...except...关键字

    在写代码的时候,需要考虑这段代码可能会出现什么样的错误,然后做对应的处理。try里面就是包含你做处理的代码,except里面就是出了某种错误后,怎么去处理。下面来处理除数不能为0的异常

    def cal (a,b):
        try:#捕捉异常关键字
            res = a/b
        except ZeroDivisionError as e:#e代表错误信息,如果上面的两行代码出现了ValueError这个错则
            print(e)#division by zero
            return '除数不能为0'
        return res #这个是如果没有这个异常的话,就返回结果
    print(cal(5,1))#调用,没有错误,结果是5.0
    print(cal(5,0))#这样再调用就不会报错了,会返回'除数不能为0'

    二、捕捉所有异常

    1、Exception

      上面捕捉异常只能捕捉到除数为0的错误,如果是别的错误就捕捉不到了。可以将具体的错误改为Exception,这样就可以捕捉所有异常了

    2、finally

      不管是否有异常都会执行Finally后的程序

    3、捕捉异常中的else

      如果出异常就执行except后的程序,不出异常就走else后程序

    def cal (a,b):
        try:#捕捉异常
            res = a/b
        except ZeroDivisionError as e:#捕捉ValueError这个异常,有try就有except
            print(e)
            return '除数不能为0'
        except Exception as e:#捕捉所有的异常,不管你有什么异常都可以捕捉到
            print('其他异常')
            return e#返回错误信息
        else:#这个else和上面的try对应的,不出异常的话走这里,不是必须写的
            print('没有异常')
            return res  # 没有异常,就返回结果
        finally:#不管这段代码有没有出异常都执行它,不是必须写的
            print('出没出异常都走这里')
    print(cal(5,0))#出除数异常了,会返回除数不能为0!和执行finally里面的代码
    # division by zero
    # 出没出异常都走这里,先到finally
    # 除数不能为0,再打印retern的返回值
    print(cal(5,1))#这个没有出异常,就会走else里面的东西,返回结果,也会执行执行finally里面的代码
    print(cal(5,'s'))#这个也走异常了,除数是字符串,肯定不能除,就走那个捕捉所有异常的代码了,也会执行执行finally里面的代码

    这里有个有意思的地方,函数不管是否出异常,都会先执行finally再返回return的结果。

    三、异常捕捉练习:完善mysql操作函数

    首先考虑在操作数据库的过程中会遇到什么错误呢?

      数据库连接失败,sql出错

    下面来捕捉并处理这两个错误

    def my_db(sql):
        try:
            coon = pymysql.connect(**MYSQL_INFO)
        except Exception as e:
            print('数据库连接失败')
            return '数据库连接失败'#遇到return函数结束
        # 这里没有return下面要加else防止代码继续执行
        cur = coon.cursor()
        try:
            cur.execute(sql)
        except Exception as res:
            print('sql出错,sql是%s'%sql)
        else:#没有出错
            if sql.strip()[:6].upper()=='SELECT':
                res =  cur.fetchall()
            else:
                coon.commit()
                res = 'ok'
        finally:#对应的是sql出错的try,连接数据库错直接return跳出函数
            cur.close()
            coon.close()
        return res

    四、常见异常

    AttributeError: 试图访问一个对象没有的属性,比如foo.x,但是foo没有属性x
    
    IOError:输入 / 输出异常,一般是无法打开文件
    
    ImportError: 无法导入模块或包,一般是路径问题或名称错误
    
    IndentationError:代码没有正确对齐,属于语法错误
    
    IndexError:下标索引超出序列边界,比如x只有三个元素,却试图访问x[3]
    
    KeyError:试图访问字典里不存在的键
    
    KeyboardInterrupt:Ctrl + C被按下
    
    NameError:使用一个还未被赋予对象的变量
    
    SyntaxError: 语法错误
    
    TypeError: 传入对象类型与要求的不符
    
    UnboundLocalError:试图访问一个还未被设置的局部变量,一般是由于在代码块外部还有另一个同名变量
    
    ValueError: 传入一个调用者不期望的值,即使值的类型是正确的 

    五、主动抛出异常

      就是在代码里让它自动抛出一个异常,然后捕捉到。比如我们在写自动化测试脚本时,结果和预期不符,就可以主动抛出一个异常,然后捕捉到做其他处理。主动抛出异常使用raise关键字。

    try:
        raise KeyError#主动抛出一个keyerror的异常
    except KeyError as e:
        print('这是主动抛出的异常')
  • 相关阅读:
    小峰视频十三:二维数组
    小峰视频十二:java数组
    小峰视频十一:循环结构的跳出
    小峰视频十:循环while、for
    小峰视频九:选择语句if、switch
    小峰视频八:逻辑运算符、关系运算符、三门运算符
    小峰视频七:数据类型转换、数据运算
    eggjs+vue实现下载图片 js下载网络图片
    报错/Warning: You should not use <Route component> and <Route children> in the same route; <Route component> will be ignored
    React/事件系统
  • 原文地址:https://www.cnblogs.com/dongrui624/p/9054142.html
Copyright © 2011-2022 走看看