• python异常处理


    参考语法:https://docs.python.org/zh-cn/3/tutorial/errors.html
    在编写代码的时候,如果你写的程序出现报错,程序就会停止运行,后面的代码就不再执行。
    如果程序发生错误,可以在代码中添加异常处理,保证程序能够执行。

    基本使用方式

    下面的代码,运行的过程中有什么风险?

    
    num = int(input("请输入一个数字:"))
    
    if num > 100:
        print("yes")
    else:
        print("No")
    
    
    print("程序执行完毕")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    上面的程序,如果输入的数据是数字,能够正常执行,
    但是如果输入的数据是 非数字,程序报错,不再往下执行。
    在这里插入图片描述

    异常处理

    try … except…

    在代码可能出现异常的地方进行异常处理,比如,上面的程序,通过报错信息可以看到, 第三行代码,抛出valueerror的错误。
    在这里插入图片描述
    进行异常处理。

    
    try:
        num = int(input("请输入一个数字:"))
        if num > 100:
            print("yes")
        else:
            print("No")
        # 当出现valueError的时候
    except ValueError:
        print("输入的数据有误,请使用数字输入!")
    
    
    print("程序执行完毕")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    将可能出现的异常代码放在 try 语句块中
    异常信息捕获代码放在 except 中。
    再次执行
    在这里插入图片描述

    try … except… 多个异常

    下面查看这段代码。

    # 打开文件 文件读取权限
    f = open(file='helloworld.txt',mode='r')
    # 读取文件中的内容
    data = f.readline()
    # 将读取的内容转换为数字
    a = int(data)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    这段代码有可能出现两种错误。

    • 文件不存在
    • 内容转为数字的时候会出现问题。
    • 在这里插入图片描述
      如果当发生异常的时候,可以统一处理。
    try:
        # 打开文件 文件读取权限
        f = open(file='helloworld.txt',mode='r')
        # 读取文件中的内容
        data = f.readline()
        # 将读取的内容转换为数字
        a = int(data)
    except (FileNotFoundError,ValueError):
        print("发生未知错误! 请检查")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • except (FileNotFoundError,ValueError): 将两个异常放在一起,只要发生其中一个就处理。

    也可以分开处理异常

    针对上面的异常,也可以分开处理。
    针对不同异常,单独处理。

    try:
        # 打开文件 文件读取权限
        f = open(file='helloworld.txt',mode='r')
        # 读取文件中的内容
        data = f.readline()
        # 将读取的内容转换为数字
        a = int(data)
        # 文件找不到异常
    except FileNotFoundError:
        print("文件找不到,请检查文件路径")
    except ValueError:
        print("数据转换问题,请检查数据")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    try … except Excpetion

    上面处理异常是基于自己对程序已知可能出现的异常。如果对程序也不知道会发生那种类型的异常。也可统一使用 Expectation 来捕获所有的异常。

    try:
        b = 10/0
        # 打开文件 文件读取权限
        f = open(file='helloworld.txt',mode='r')
        # 读取文件中的内容
        data = f.readline()
        # 将读取的内容转换为数字
        a = int(data)
        # 文件找不到异常
    except FileNotFoundError:
        print("文件找不到,请检查文件路径")
    except ValueError:
        print("数据转换问题,请检查数据")
    except Exception:
        print("发生未知异常")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    exception 在使用的时候,放在最后位置。

    raise 抛出异常

    while True:
        print('我爱学习')
        # 手动抛出异常,程序会停止运行
        raise Exception
    
    • 1
    • 2
    • 3
    • 4

    后面做UI自动化的时候,需要定位元素,当元素等待不出来的时候,不能一直等,可以手动抛出异常。
    在这里插入图片描述

    在程序运行的过程中,无法保证每一次运行都顺利,那么就有可能会出现异常,那么对异常会怎样处理呢?

    异常情况 
    try: 后面写的是有可能出现异常的代码 
    except: 如果出现异常了,想要显示的代码 
    else: 如果没有出现异常,你后续想要处理的代码 
    finally: 不管出不出现异常,都会执行的代码
        
    try: 
        a = 10 
        b = "20" 
        print(a + b) 
    except TypeError as t: 
        print("代码出bug啦!,导致问题的原因是:{}".format(t)) 
    else: 
        print("代码非常成功!真棒!") 
    finally: 
        print("----欢迎再次光临-----") 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    常见的异常类型:

    NameError: 变量没定义
    SyntaxError: 语法错误
    KeyError: 键不存在
    ModuleNotFountError:模块未找到
    TypeError:类型错误

    指定异常类型捕获:

    异常捕获时:语法错误是捕获不到的。如果要捕获多个异常类型:
    方式一:使用多个except,每一个except都可以指定捕获的异常类型,适合不同类型的异常做不同的处理
    方式二:使用一个except捕获多个类型的异常,使用多个类型的 异常采用相同的处理方式

    try: 
        print(a) 
        f = open("fff.txt","r",encoding="utf8") 
    except (NameError,FileNotFoundError,KeyError) as error: 
        print(error) 
        print("代码有异常") 
    except FileNotFoundError as error: 
        print(error) 
    else: 
        print("代码没有异常") 
    finally: 
        print("代码不管有没有异常都会执行") 
    try: 
        print(a) 
    except Exception: 
        print("捕获到了异常") 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    logging日志

    日志模块

    日志在程序中必不可少,日志会记录程序员的操作记录和用户的行为记录,以及异常的日志打印
    python中如何去记录日志?
    首先我们要引入logging模块

    import logging
    
    • 1

    python的日志等级

    debug 输出详细的运行环境,主要用于调试
    info 确认一切按预期运行,一般用于输出重要运行情况
    warning 一些意想不到的情况发生了 比如内存空间不足,但是软件还能继续工作
    error 某些程序因为一些原因没有执行,发生了错误,但程序还会继续执行不会崩溃
    critical 致命的,一些严重的错误会被记录。程序无法继续运行,导致崩溃

    logging.debug("这是debug等级的日志")
    logging.info("这是info等级的日志")
    logging.warning("这是warning等级的日志")
    logging.error("这是error等级的日志")
    logging.critical("这是critical等级的日志")
    
    • 1
    • 2
    • 3
    • 4
    • 5

    logging就是日志模块

    import logging
    import py_apitest
    #日志的严重级别debug  info  warning  error  critical
    logging.warning("这是info等级的日志")
    print("这是print的内容")
    
    日志中的root叫做日志收集器,root默认的收集器不输出debug 和 info的等级日志。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    logging具体代码

    #1.首先创建日志收集器
    mylog = logging.getLogger("libai")
    #2.创建日志收集器收集的日志等级
    mylog.setLevel("DEBUG")
    #3.设置输入到控制台的渠道
    sh = logging.StreamHandler()
    #4.设置日志输出渠道的等级
    sh.setLevel("DEBUG")
    #5.将输出渠道添加进日志收集器中
    mylog.addHandler(sh)
    #6.将输出的日志添加进一个文件中
    fh = logging.FileHandler("xiaosun.log","a",encoding="utf8")
    #7.再给这个日志文件设置输入的等级
    fh.setLevel("DEBUG")
    #8.把文件输出内容添加进日志收集器中
    mylog.addHandler(fh)
    #9.设置工作中的日志文件输出格式
    formater = '%(asctime)s - [%(filename)s-->line:%(lineno)d] - %(levelname)s: %(message)s'
    #10.把这个格式带入进日志中
    fm = logging.Formatter(formater)
    #11.将日志的格式与输出渠道进行绑定
    fh.setFormatter(fm)
    sh.setFormatter(fm)
    #12.打印日志
    mylog.debug(py_apitest.newbee_login())
    mylog.warning("这是warning的日志文件内容")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
  • 相关阅读:
    无碳越障S型小车总体设计(lunwen+工序卡+过程卡+cad图纸+proe三维图纸+运动仿真视频)
    --端口--
    gRPC之grpc resolver
    英文科技论文写作与发表-写作实践(第7章)
    JavaScript从入门到精通系列第二十九篇:正则表达式初体验
    Ansible任务控制loop循环、when和block条件判断介绍演示
    [题]Balanced Lineup G #倍增
    Webpack 通过SplitChunksPlugin实现包拆分
    EL表达式的内置对象及其作用域
    netstat Recv-Q Send-Q
  • 原文地址:https://blog.csdn.net/a1137588003/article/details/132818189